Mysql
 sql >> Base de données >  >> RDS >> Mysql

Essayer de faire LOAD DATA INFILE avec REPLACE et AUTO_INCREMENT

OBSERVATION #1

Vous ne devriez pas faire REPLACE car il s'agit d'un DELETE mécanique et INSERT .

Comme la Documentation MySQL dit à propos de REMPLACER

Paragraphe 2

Paragraphe 5

L'utilisation de REPLACE supprimera les valeurs établies pour TEST_ID qui ne peuvent pas être automatiquement réutilisées.

OBSERVATION #2

La disposition du tableau ne prend pas en charge le piégeage des clés en double

Si un nom est unique, le tableau doit être présenté comme ceci

MISE EN PAGE #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`)
) 

Si un nom autorise plusieurs valeurs, le tableau doit être présenté comme ceci

MISE EN PAGE #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`)
) 

SOLUTION PROPOSÉE

Utilisez une table temporaire pour tout saisir. Ensuite, effectuez un gros INSERT à partir de la table temporaire en fonction de la disposition

MISE EN PAGE #1

Remplacez la VALUE pour un NAME en double

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

MISE EN PAGE #2

Ignorer le doublon (NAME,VALUE) lignes

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

Mettre à jour

si nous devons éviter la création et la suppression de la table à chaque fois. nous pouvons TRUNCATE TRUNCATE la table avant ou après l'utilisation de l'instruction INSERT...INTO. Par conséquent, nous n'aurons pas à créer la table la prochaine fois.