Ответ 1
ЗАМЕЧАНИЕ № 1
Вы не должны делать REPLACE
, потому что это механический DELETE
и INSERT
.
Как Документация MySQL говорит о REPLACE
Пункт 2
REPLACE - это расширение MySQL для стандарта SQL. Он либо вставляет, либо удаляет и вставляет. Для другого расширения MySQL для стандартного SQL, которое либо вставляет, либо обновляет - см. Раздел 13.2.5.3, "ВСТАВИТЬ... НА ПОДКЛЮЧЕНИЕ КЛЮЧА КЛЮЧА".
Пункт 5
Чтобы использовать REPLACE, у вас должны быть как привилегии INSERT, так и DELETE для таблицы.
Использование REPLACE отбросит установленные значения для TEST_ID, которые нельзя будет повторно использовать повторно.
ЗАМЕЧАНИЕ # 2
Макет таблицы не поддерживает захват дубликатов клавиш
Если имя уникально, таблица должна быть выложена следующим образом
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`)
)
Если имя допускает несколько значений, таблица должна быть выложена следующим образом
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`)
)
ПРЕДЛАГАЕМОЕ РЕШЕНИЕ
Используйте временную таблицу, чтобы поймать все. Затем выполните большой INSERT из таблицы temp на основе макета
LAYOUT # 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'
INSERT 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
Игнорировать повторяющиеся строки (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'
INSERT 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`;