2016-06-12 10 views
0

爲null,我創建了獨特的複合指數:創造獨特的合成指數,其中一個字段可以在MySQL

Alter Table TableX Add Unique Index `UniqueRecord` (A,B,C,D) 

的問題是,有時C可以爲NULL。

我注意到,

`Insert IGNORE` 

仍然在某些情況下增加重複的記錄,這竟然是當這些傳入記錄了C爲NULL。

我測試的假設,這是一個問題,這樣做:

​​

而且Index在每個這種情況下,其實是NULL。一旦我從選擇刪除空字段:

Select concat(A,B,D) as Index from TableA where C is NULL 

我得到預期的字符串值與空值。

所以問題是,除了像set C='' where C is NULL這樣的更新之外,是否有一些方法可以設置索引以便它起作用?我不喜歡簡單地製作索引A,B,D,因爲當C實際上不是NULL時,可能會引入不需要的重複。

更新: 我曾嘗試在索引創建使用IfNull但MySQL並沒有這樣的:

Alter Table TableA Add Unique Index UniqueLocator (A,B,IfNull(C,''),D 

MySQL表示:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'C,''),D)' at line 1

回答

0

是MySQL允許在唯一索引空值,這是正確的做法。但是如果你不喜歡,你可以將C列定義爲NOT NULL。

+0

Tha是一個非常簡單的解決方案謝謝。我仍在考慮如果這可能會導致現有的代碼/查詢意外的問題。 – user3649739

0

MySQL - 但不是所有數據庫 - 允許在唯一索引中重複使用NULL值。我認爲ANSI標準在這一點上相當模糊(甚至可能相互矛盾)。你基本上有兩個選擇。

第一個是定義列的默認值。這可能對代碼沒有吸引力,但至少會在重複插入時產生錯誤。例如,如果「C」是對自動遞增ID的外鍵引用,則可以使用-10作爲默認值。如果是日期,則可以使用零日期。

另一種解決方案是一個觸發器,您在執行插入(或更新)之前手動檢查重複值。

+0

@GordongLinoff我嘗試在索引描述中使用IfNull,即'Alter Table TableA Add Unique Index UniqueLocator(A,B,IfNull(C,''),D)',但它不喜歡那樣。現在我正在將該字段更改爲Empty String vs NULL,只是試圖確定可能會破壞其他代碼的位置。 – user3649739

+0

@ user3649739。 。 。一種可能性是使用一個特殊的值,然後使用一個將其變回「NULL」值的視圖來訪問該表。 –

+0

@Linoff謝謝,到目前爲止,將字段更改爲空字符串作爲默認vs NULL似乎解決了這個問題。 – user3649739

相關問題