2016-09-21 53 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

這是由於您的MARCA專欄沒有UNIQUE索引。

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忽略或一個當你做一個負荷數據替換。

+0

感謝略知一二!像往常一樣非常有用。 :-)我還注意到我的數據正在從文件的第二列加載。首先被完全忽略。有什麼理由呢? – CNB

+0

,很高興能有所幫助。所有與您的項目最好 – e4c5

+1

沒關係,發現我錯了。 :-) – CNB

0

願你從這個

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

這將是非常緩慢 – e4c5