Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Tentando fazer LOAD DATA INFILE com REPLACE e AUTO_INCREMENT

OBSERVAÇÃO #1


Você não deve fazer REPLACE porque é um DELETE mecânico e INSERT .

Como a Documentação MySQL diz sobre SUBSTITUIR

Parágrafo 2

Parágrafo 5

O uso de REPLACE descartará valores estabelecidos para TEST_ID que não podem ser reutilizados automaticamente.

OBSERVAÇÃO #2


O layout da tabela não suportará a captura de chaves duplicadas

Se um nome for único, a tabela deve ser disposta assim

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

Se um nome permite vários valores, a tabela deve ser apresentada assim

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

SOLUÇÃO PROPOSTA


Use uma tabela temporária para pegar tudo. Em seguida, execute um grande INSERT da tabela temporária com base no layout

LAYOUT #1


Substitua o VALUE para um 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`;

LAYOUT #2


Ignorar duplicado (NAME,VALUE) linhas
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`;

Atualizar


se precisarmos evitar a criação e o descarte da tabela a cada vez. podemos TRUNCAR TRUNCATE a tabela antes ou depois de usar a instrução INSERT...INTO. Portanto, não precisamos criar a tabela na próxima vez.