BEOBACHTUNG #1
Sie sollten REPLACE
nicht ausführen weil es ein mechanisches DELETE
ist und INSERT
.
Als MySQL-Dokumentation sagt über REPLACE
Absatz 2
Absatz 5
Die Verwendung von REPLACE verwirft etablierte Werte für TEST_ID, die nicht automatisch wiederverwendet werden können.
BEOBACHTUNG #2
Das Tabellenlayout unterstützt kein Trapping von doppelten Schlüsseln
Wenn ein Name eindeutig ist, sollte die Tabelle so aufgebaut sein
LAYOUT #1
CREATE TABLE `oxygen_domain`.`TEST` (
`TEST_ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) NOT NULL,
`VALUE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`TEST_ID`),
KEY (`NAME`)
)
Wenn ein Name mehrere Werte zulässt, sollte die Tabelle so aufgebaut sein
LAYOUT #2
CREATE TABLE `oxygen_domain`.`TEST` (
`TEST_ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) NOT NULL,
`VALUE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`TEST_ID`),
KEY (`NAME`,`VALUE`)
)
LÖSUNGSVORSCHLAG
Verwenden Sie eine temporäre Tabelle, um alles abzufangen. Führen Sie dann ein großes INSERT aus der temporären Tabelle basierend auf dem Layout durch
LAYOUT #1
Ersetzen Sie den VALUE
für einen doppelten NAME
USE oxygen_domain
DROP TABLE IF EXISTS `TESTLOAD`;
CREATE TABLE `TESTLOAD` SELECT NAME,VALUE FROM TEST WHERE 1=2;
LOAD DATA LOCAL INFILE 'C:/testData.txt'
INTO TABLE `TESTLOAD`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(NAME, VALUE);
INSERT INTO `TEST` (NAME, VALUE)
SELECT NAME, VALUE FROM `TESTLOAD`
ON DUPLICATE KEY UPDATE VALUE = VALUES(VALUE);
DROP TABLE `TESTLOAD`;
LAYOUT #2
Doppeltes (NAME,VALUE)
ignorieren Zeilen
USE oxygen_domain
DROP TABLE IF EXISTS `TESTLOAD`;
CREATE TABLE `TESTLOAD` SELECT NAME,VALUE FROM TEST WHERE 1=2;
LOAD DATA LOCAL INFILE 'C:/testData.txt'
INTO TABLE `TESTLOAD`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(NAME, VALUE);
INSERT IGNORE INTO `TEST` (NAME, VALUE)
SELECT NAME, VALUE FROM `TESTLOAD`;
DROP TABLE `TESTLOAD`;
Aktualisieren
wenn wir das Erstellen und Löschen der Tabelle jedes Mal vermeiden müssen. wir können KÜRZEN die Tabelle vor oder nach der Verwendung der INSERT...INTO-Anweisung. Daher müssen wir die Tabelle beim nächsten Mal nicht erstellen.