OBSERVATION #1
Du bør ikke gøre REPLACE
fordi det er en mekanisk DELETE
og INSERT
.
Som MySQL-dokumentation siger om REPLACE
Stk. 2
Afsnit 5
Brug af REPLACE vil kaste etablerede værdier for TEST_ID væk, som ikke automatisk kan genbruges.
OBSERVATION #2
Tabellayoutet understøtter ikke indfangning af dublerede nøgler
Hvis et navn er unikt, skal tabellen opstilles således
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`)
)
Hvis et navn tillader flere værdier, skal tabellen opstilles sådan her
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`)
)
FORSLAG TIL LØSNING
Brug en temp-tabel til at fange alt. Udfør derefter en stor INSERT fra temp-tabellen baseret på layout
LAYOUT #1
Erstat VALUE
for et dublet 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
Ignorer dublet (NAME,VALUE)
rækker
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`;
Opdater
hvis vi skal undgå at skabe og tabe bordet hver gang. vi kan TRUNCATE TRUNCATE tabellen før eller efter brug af INSERT...INTO-sætning. Derfor behøver vi ikke oprette tabellen næste gang.