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.