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

Forsøger at udføre LOAD DATA INFILE med REPLACE og AUTO_INCREMENT

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.



  1. [01000][unixODBC][Driver Manager]Kan ikke åbne lib '/usr/local/easysoft/oracle/InstantClient112/lib/libsqora.so':fil blev ikke fundet

  2. Tidsmæssigt databasedesign med et twist (live vs kladderækker)

  3. FEJL:tilladelse nægtet for skema user1_gmail_com ved tegn 46

  4. Samarbejdsfiltrering i MySQL?