sql >> Databasteknik >  >> RDS >> Mysql

Försöker göra LOAD DATA INFILE med REPLACE och AUTO_INCREMENT

OBSERVATION #1

Du bör inte göra REPLACE eftersom det är en mekanisk DELETE och INSERT .

Som MySQL-dokumentationen säger om REPLACE

Punkt 2

Punkt 5

Att använda REPLACE kommer att kasta bort etablerade värden för TEST_ID som inte kan återanvändas automatiskt.

OBSERVATION #2

Tabelllayouten stöder inte svängning av dubbletter av nycklar

Om ett namn är unikt bör tabellen läggas upp så här

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

Om ett namn tillåter flera värden bör tabellen läggas upp så här

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

FÖRSLAG LÖSNING

Använd en temptabell för att fånga allt. Utför sedan en stor INSERT från temptabellen baserat på layout

LAYOUT #1

Ersätt VALUE för en dubblett av 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

Ignorera dubblett (NAME,VALUE) rader

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

Uppdatera

om vi behöver undvika att skapa och släppa bordet varje gång. vi kan TRUNCATE TRUNCATE tabellen före eller efter användning av INSERT...INTO-satsen. Därför behöver vi inte skapa tabellen nästa gång.



  1. Pgbackrest återställ tidsmål

  2. Förstå SQL Server alltid krypterad

  3. mysql- Hur ansöker man om bidrag till kolumn?

  4. Basklass och härledda objektvarianter