sql >> Database >  >> RDS >> Mysql

Probeer LOAD DATA INFILE te doen met REPLACE en AUTO_INCREMENT

OBSERVATIE #1

U moet REPLACE niet doen omdat het een mechanische DELETE . is en INSERT .

Als de MySQL-documentatie zegt over VERVANGEN

Paragraaf 2

Paragraaf 5

Als u REPLACE gebruikt, worden bestaande waarden voor TEST_ID weggegooid die niet automatisch opnieuw kunnen worden gebruikt.

OBSERVATIE #2

De tabellay-out ondersteunt het overvullen van dubbele sleutels niet

Als een naam uniek is, moet de tabel als volgt worden ingedeeld

LAY-OUT #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`)
) 

Als een naam meerdere waarden toestaat, moet de tabel als volgt worden ingedeeld

LAY-OUT #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`)
) 

VOORGESTELDE OPLOSSING

Gebruik een tijdelijke tabel om alles op te vangen. Voer vervolgens een grote INSERT uit vanuit de tijdelijke tabel op basis van lay-out

LAY-OUT #1

Vervang de VALUE voor een dubbele 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`;

LAY-OUT #2

Negeer dubbele (NAME,VALUE) rijen

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

Bijwerken

als we het maken en neerzetten van de tabel elke keer moeten vermijden. we kunnen AFSLUITEN de tabel voor of na het gebruik van de INSERT...INTO-instructie. Daarom hoeven we de volgende keer de tabel niet te maken.



  1. Is de kolomvolgorde van belang in uw MySQL-tabellen?

  2. Mysql-dekking versus composiet versus kolomindex

  3. PHP kan onder bepaalde omstandigheden de mysql-containernaam niet oplossen

  4. wat is de juiste manier om te converteren tussen mysql datetime en python timestamp?