Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Der Versuch, LOAD DATA INFILE mit REPLACE und AUTO_INCREMENT auszuführen

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.