Mysql
 sql >> Database >  >> RDS >> Mysql

Tentativo di eseguire LOAD DATA INFILE con REPLACE e AUTO_INCREMENT

OSSERVAZIONE #1

Non dovresti fare REPLACE perché è un DELETE meccanico e INSERT .

Come la Documentazione MySQL dice su REPLACE

Paragrafo 2

Paragrafo 5

L'uso di REPLACE eliminerà i valori stabiliti per TEST_ID che non possono essere riutilizzati automaticamente.

OSSERVAZIONE #2

Il layout della tabella non supporterà il trapping delle chiavi duplicate

Se un nome è univoco, la tabella dovrebbe essere disposta in questo modo

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`)
) 

Se un nome consente più valori, la tabella dovrebbe essere strutturata in questo modo

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`)
) 

SOLUZIONE PROPOSTA

Usa un tavolo temporaneo per prendere tutto. Quindi, esegui un grande INSERT dalla tabella temporanea in base al layout

LAYOUT #1

Sostituisci il VALUE per un NAME duplicato

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

Ignora il duplicato (NAME,VALUE) righe

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`;

Aggiorna

se dobbiamo evitare la creazione e l'eliminazione della tabella ogni volta. possiamo TRUNCATE TRUNCATE la tabella prima o dopo l'utilizzo dell'istruzione INSERT...INTO. Pertanto, non è necessario creare la tabella la prossima volta.