2016-09-21 5 views
1

У меня есть файл, который я успешно обновил до таблицы. Теперь я должен сделать это снова таким образом, чтобы данные не повторялись.Вставьте неповторяющиеся данные в таблицу

моя целевая таблица:

mysql> show columns from MARCAS; 
+----------+-------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+----------+-------------+------+-----+---------+----------------+ 
| ID_MARCA | int(11)  | NO | PRI | NULL | auto_increment | 
| MARCA | varchar(50) | YES |  | NULL |    | 
+----------+-------------+------+-----+---------+----------------+ 

Так что я сделал, чтобы создать временную таблицу и загруженные данные из файла в него.

код используется:

CREATE TEMPORARY TABLE tempe LIKE marcas; 
LOAD DATA LOCAL INFILE myfile.txt 
INTO TABLE MARCAS 
FIELDS TERMINATED BY '#' ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(ID_MARCA, MARCA, @ignore1, @ignore2, @ignore3); 

Все нормально здесь. Проблема начинается, когда я пытаюсь быть умным и использую «ON DUPLICATE KEY» (как это было сказано здесь) для вставки данных из временной таблицы в таблицу MARCAS, так как данные не повторяются. Код я использовал:

INSERT into MARCAS select * from TEMPE on duplicate key update MARCA=values(MARCA); 

Результат:

mysql> select * from MARCAS; 
+----------+---------+ 
| ID_MARCA | MARCA | 
+----------+---------+ 
|  1 | PICASSA | 
|  2 | PICASSA | 
|  3 | C4  | 
|  4 | C4  | 
|  5 | C3  | 
|  6 | C3  | 
|  7 | C2  | 
|  8 | C2  | 
|  9 | MONDEO | 
|  10 | MONDEO | 
|  11 | S-MAX | 
|  12 | S-MAX | 
|  13 | CIVIC | 
|  14 | CIVIC | 
|  15 | ACCORD | 
|  16 | ACCORD | 
|  17 | CLS  | 
|  18 | 900  | 
|  19 | LEON | 
|  20 | LEON | 
|  21 | IBIZA | 
|  22 | IBIZA | 
|  23 | 307  | 
|  24 | 307  | 
|  25 | 308  | 
|  26 | 308  | 
|  27 | 407  | 
|  28 | 407  | 
|  29 | 408  | 
|  30 | 408  | 
|  31 | MEGANE | 
|  32 | MEGANE | 
|  33 | PASSAT | 
|  34 | PASSAT | 
|  35 | GOLF | 
|  36 | GOLF | 
|  37 | TOUAREG | 
+----------+---------+ 

Не впечатлило с собой. Что я делаю не так?

ответ

1

Это связано с тем, что у вас нет индекса UNIQUE в столбце MARCA.

alter table MARCAS add unique(MARCA); 

Если вы указываете ON DUPLICATE KEY UPDATE, и вставляется строка, что приведет дубликата значение в UNIQUE индекс или PRIMARY KEY, MySQL выполняет UPDATE старой строки ,

Источник: http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

Обратите внимание, что это также можно сделать INSERT IGNORE или А REPLACE, когда вы делаете данные нагрузки.

+0

спасибо! как обычно очень полезно. :-) Я также заметил, что мои данные загружаются из второго столбца в файле. Первый полностью игнорируется. Любая причина для этого? – CNB

+0

, и было приятно помочь. все самое лучшее с вашим проектом – e4c5

+1

Nevermind, нашел, где я был неправ. :-) – CNB

0

Может вы получите некоторое представление от этого

INSERT INTO MARCAS(field1) 
WHERE NOT EXISTS (
    SELECT field1 FROM MARCAS WHERE name = 'field1' 
) LIMIT 1; 
+0

, что будет очень медленным – e4c5