2012-04-30 90 views
2

我想提出一個標準的做法來防止任何表在重要位置有重複。在大多數情況下,重複是變量的組合,而不是一個。我的主鍵只是每個字段的唯一ID,所以我無法使用它們。我一直在做的是先查詢表,然後如果組合的行數是0,則進行插入操作。不過,我已經讀過,應該可以在多個字段上設置一個唯一的鍵來強制唯一性。 INSERT IGNORE聽起來像是一個很好的可能性,但是,我需要它忽略多個列。php/mysql防止在多列上出現重複條目​​

作爲一個例子,隨着領域的追隨者和追隨者,在表中可以有多個追隨者和追隨者,但應該只是兩者的組合。

任何人都可以首先建議語法來創建多個字段上的唯一鍵,然後做一個SQL插入查詢,防止愚蠢?非常感謝。

回答

14

您可以簡單地在這些列上創建多列索引並強制實現唯一性:請參閱MySQL手冊http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

例如,在與列id(唯一的主鍵),colAcolB表,我們可以運行:

ALTER TABLE table ADD UNIQUE KEY (colA,colB) 

這是它:任何導致這兩列合併重複條目插入都將現在返回一個MySQL錯誤,而不是通過。如果你使用INSERT IGNORE,如果執行它會違反這個唯一約束,將不會拋出MySQL錯誤,並且你的INSERT語句將被安靜地忽略。

+2

但是,這隻適用於小數據類型(最大1000字節)。如果您需要爲超過1000字節的列創建索引,例如VARCHAR(1001),則必須在列後指定長度:'... KEY(colA(length),...' –

+0

非常明確的代碼解釋!謝謝。 – user1260310

+0

不客氣! – Daan

3

爲了使文本類型的唯一索引可以使用

CREATE UNIQUE INDEX indexname ON `tablename` (columnname (100)); 

(100)列名告訴MySQL只檢查前100個字節爲唯一,如果指定(4)長則兩個

後這裏
hello 
hello world 

與索引相同(兩者實際上都是索引樹中的hell),並且mysql不允許將它們插入到表中。

請看這裏http://dev.mysql.com/doc/refman/5.0/en/create-index.html

+0

愛長度的想法,以前不知道,謝謝! – liamvictor