2010-11-27 88 views
0

我必須從外部來源插入一些數據。
我的php函數定期運行並獲取結果&將這些插入到表中。如何在mysql中丟棄重複記錄的插入?

通常會有已保存的結果。
所以他們再次插入。

如何丟棄重複的結果以便只輸入新結果&重複被丟棄。

+1

INSERT ... ON DUPLICATE KEY UPDATE ... - http:// dev。 mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – ajreal 2010-11-27 15:10:30

+0

INSERT IGNORE`只會在沒有唯一鍵衝突的情況下插入,否則什麼也不做。 `ON DUPLICATE`將會更新。 `REPLACE`將刪除/插入else。 – Konerak 2010-11-27 20:57:05

+0

我嘗試避免使用REPLACE語句,因爲它會刪除任何唯一鍵衝突,而不僅僅是那些來自主鍵的衝突。 – Danosaure 2010-11-28 02:19:04

回答

1

如果您可以修改數據庫表的結構,最好的方法是將列的UNIQUE INDEX或許多列一起添加唯一標識單個條目的列。例如:

ALTER TABLE table ADD UNIQUE INDEX namecolumn_onecolumn_two);

如果該表已經包含重複記錄,則更改嘗試將導致錯誤。在這種情況下,您可以用忽略:

ALTER TABLE忽略ADD table UNIQUE INDEX namecolumn_onecolumn_two);

請記住,創造不必要的巨大的索引將導致:採取

  • 更多的磁盤空間高達
  • 慢編寫查詢(INSERT,UPDATE,DELETE)

http://dev.mysql.com/doc/refman/5.1/en/create-index.html (頁描述了創建索引的另一種方式,但也引用了ALTER TABLE)

0

我知道這聽起來很愚蠢,但確定如何檢測重複項並且不要插入它們。

這取決於您的數據集。如果您有唯一的字段,最簡單的方法是在數據庫中的該字段上設置唯一索引,即主鍵,並且數據庫不允許插入副本。只要檢查你的錯誤,如果你得到重複的關鍵錯誤,不理會你期望的東西。

0

這就是關於主鍵的一點,如果你明智地定義了主鍵,你將不必處理重複項,因爲你不會有任何重複項。

0

INSERT IGNORE ...命令完成此操作,假設您在表上設置了主鍵。

如果您還沒有主鍵,請將其設置爲具有相同名稱/ ID的記錄的名稱或ID,表示重複的數據。

0

所有關係數據庫都允許在單個行上使用主鍵和唯一約束。

所以,如果你有一個PERSON表的first_namelast_nameperson_id柱和獨特的組合,你應該讓person_id主鍵和(first_name, last_name)添加的唯一約束。即使主鍵是唯一的,您也無法插入違反唯一約束的行。