sql >> Base de Datos >  >> RDS >> Mysql

Intentando hacer LOAD DATA INFILE con REPLACE y AUTO_INCREMENT

OBSERVACIÓN #1

No debe hacer REPLACE porque es un DELETE mecánico y INSERT .

Como la Documentación de MySQL dice sobre REEMPLAZAR

Párrafo 2

Párrafo 5

El uso de REPLACE eliminará los valores establecidos para TEST_ID que no se pueden reutilizar automáticamente.

OBSERVACIÓN #2

El diseño de la tabla no admitirá la captura de claves duplicadas

Si un nombre es único, la tabla debe diseñarse así

DISEÑO #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 nombre permite varios valores, la tabla debe diseñarse así

DISEÑO #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`)
) 

SOLUCIÓN PROPUESTA

Use una tabla temporal para capturar todo. Luego, realice una gran INSERCIÓN desde la tabla temporal según el diseño

DISEÑO #1

Reemplace el VALUE para un NAME duplicado

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

DISEÑO #2

Ignorar duplicado (NAME,VALUE) filas

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

Actualizar

si necesitamos evitar la creación y eliminación de la tabla cada vez. podemos TRUNCATE TRUNCATE la tabla antes o después de usar la instrucción INSERT...INTO. Por lo tanto, no tenemos que crear la tabla la próxima vez.