Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Próbuję wykonać LOAD DATA INFILE za pomocą REPLACE i AUTO_INCREMENT

OBSERWACJA #1

Nie powinieneś robić REPLACE ponieważ jest to mechaniczne DELETE i INSERT .

Jako Dokumentacja MySQL mówi o WYMIANIE

Paragraf 2

Paragraf 5

Użycie REPLACE spowoduje odrzucenie ustalonych wartości dla TEST_ID, których nie można automatycznie użyć ponownie.

OBSERWACJA #2

Układ tabeli nie obsługuje zalewkowania zduplikowanych kluczy

Jeśli nazwa jest unikalna, tabela powinna wyglądać tak

UKŁAD #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`)
) 

Jeśli nazwa pozwala na wiele wartości, tabela powinna być ułożona w ten sposób

UKŁAD #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`)
) 

PROPONOWANE ROZWIĄZANIE

Użyj tymczasowego stołu, aby wszystko złapać. Następnie wykonaj dużą INSERT z tabeli tymczasowej w oparciu o układ

UKŁAD #1

Zastąp VALUE dla duplikatu 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`;

UKŁAD #2

Ignoruj ​​zduplikowane (NAME,VALUE) wiersze

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

Aktualizacja

jeśli musimy unikać tworzenia i upuszczania tabeli za każdym razem. możemy OBCIĄGNĄĆ OBCIĄGNĄĆ tabeli przed lub po użyciu instrukcji INSERT...INTO. Dlatego nie musimy tworzyć tabeli następnym razem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Case w instrukcji Select z operatorem LIKE

  2. MySQL:różnica dwóch zestawów wyników

  3. Jaka jest właściwa konwencja nazewnictwa dla pakietów MySQL FK?

  4. MySQL MATCH nie działa z dwoma znakami?

  5. MySQL - Jak przestawić kolumny na wiersze?