2015-10-14 84 views
0

我正在將一些數據從csv文件導入到MySQL並試圖忽略重複的行。忽略重複的行

mysql_query("INSERT IGNORE INTO products (parent_product_url, child_product_url, swatch) VALUES ('".$row[0]."', '".$row[1]."', '".$row[2]."')"); 

我的csv文件。

polo.htm,red.htm,red.jpg 
polo.htm,green.htm,green.jpg 
round-neck.htm,green.htm,green.jpg 

現在,如果我運行下面的csv文件,因爲他們已經在表中存在,它應該忽略前三行。它應該只插入第四行。

polo.htm,red.htm,red.jpg 
polo.htm,green.htm,green.jpg 
round-neck.htm,green.htm,green.jpg 
v-neck.htm,red.htm,red.jpg 
+0

什麼是產品的主鍵,你有什麼獨特的鍵也? – zedfoxus

+0

ID是主鍵,它具有自動增量功能,我沒有唯一鍵,但我認爲我們可以將「child_product_url」視爲唯一鍵。 – AZee

+0

好的,在這種情況下,MySQL的行爲是正確的。如果該記錄違反主鍵或唯一鍵,'insert ignore'將會引發警告並且不插入記錄。由於這三個字段的組合並沒有違反任何約束,所以MySQL樂於重複地插入這些數據。爲了防止這種情況發生,您可以在parent_product_url上創建唯一的索引(如果這樣做有意義)。 – zedfoxus

回答

0

我知道了這個答案的幫助下解決了 - >Insert query check if record exists - If not, Insert it

下面是我更新的查詢

mysql_query("INSERT INTO products (parent_product_url, child_product_url, swatch) 
      SELECT * FROM (SELECT '".$row[0]."', '".$row[1]."', '".$row[2]."') AS tmp 
      WHERE NOT EXISTS (
      SELECT * FROM products WHERE parent_product_url='".$row[0]."' AND child_product_url='".$row[1]."' AND swatch='".$row[2]."' 
      );"); 
+0

謝謝。會做 :) – AZee

1

我喜歡on duplicate key update因爲insert ignore忽略所有錯誤,而不僅僅是重複的錯誤。

無論你使用哪個,你的問題可能是缺乏唯一的約束/索引。

您不指定「重複」的含義。假設您指的是所有列:

create unique index unq_products_3 on products(parent_product_url, child_product_url, swatch); 

注意:根據存儲引擎的不同,索引所用的鍵有最大長度。如果你的專欄太長,你可能需要考慮其他方法。

+0

是的,我的意思是所有的列,整個行。 – AZee

0

當您重新執行插入語句時會再次插入記錄,因爲插入未違反任何唯一或主鍵索引。因此MySQL沒有什麼可以忽略的。

create table products (
    parent_product_url varchar(100), 
    child_product_url varchar(100), 
    swatch varchar(100) 
); 

-- this will enter both records 
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg'); 
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg'); 

-- this will enter both records **AGAIN** 
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg'); 
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg'); 

現在讓我們添加獨特性parent_product_url,然後再試一次:

truncate table products; 
create unique index uk_products_parent_product_url on products(parent_product_url); 
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg'); 
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg'); 

這將只輸入第一個記錄。第二條記錄將被忽略,並會引發警告。沒有錯誤會被拋出。

如果你渴望擁有的3列的組合是唯一的,那麼你可以這樣做(這是戈登·利諾夫提及也......我只是增加更多的上下文):

alter table products drop key uk_products_parent_product_url; 
create unique index uk_products_parenturl_childurl_swatch on 
    products(parent_product_url, child_product_url, swatch); 
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg'); 
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg'); 

即使多次重複執行相同的2個插入語句,現在您仍會看到只插入兩條記錄。

https://dev.mysql.com/doc/refman/5.5/en/insert.html

如果使用忽略關鍵字,在執行 INSERT語句中出現的錯誤被忽略。例如,如果沒有IGNORE, 重複表 中的現有UNIQUE索引或PRIMARY KEY值會導致重複鍵錯誤,並且語句會中止。使用 IGNORE,該行將被丟棄並且不會發生錯誤。忽略的錯誤可能會產生警告,儘管重複鍵錯誤不會。