Mysql
 sql >> база данни >  >> RDS >> Mysql

Опитвам се да направя LOAD DATA INFILE с REPLACE и AUTO_INCREMENT

ЗАБЕЛКА №1

Не трябва да правите REPLACE защото е механичен DELETE и INSERT .

Като Документацията на MySQL казва за REPLACE

Параграф 2

Параграф 5

Използването на REPLACE ще изхвърли установените стойности за TEST_ID, които не могат да бъдат използвани автоматично.

ЗАБЕЛКА №2

Оформлението на таблицата няма да поддържа улавяне на дублирани ключове

Ако името е уникално, таблицата трябва да бъде подредена така

Оформление №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`)
) 

Ако едно име позволява множество стойности, таблицата трябва да бъде подредена така

Оформление №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`)
) 

ПРЕДЛОЖЕНО РЕШЕНИЕ

Използвайте временна таблица, за да хванете всичко. След това извършете голямо INSERT от временната таблица въз основа на оформлението

Оформление №1

Заменете VALUE за дублирано 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`;

Оформление №2

Игнорирайте дублирания (NAME,VALUE) редове

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

Актуализиране

ако трябва да избягваме създаването и отпадането на таблицата всеки път. можем да ОТСЪЩАМЕ ОТРЕЗИ таблицата преди или след използването на оператор INSERT...INTO. Следователно не е нужно да създаваме таблицата следващия път.



  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 връща неправилен резултат при използване на множество обединявания

  2. Как да направите псевдоним на поле или колона в MySQL?

  3. MySQL през 2018 г.:Какво има в 8.0 и други наблюдения

  4. Python3 + MySql:Грешка при зареждане на модул MySQLdb:Няма модул с име 'MySQLdb'

  5. Вмъкване и избор на UUID като двоични (16)