2015-05-30 51 views
3

我有Message.rb具有列A,B,和C.唯一索引允許空值在導軌

我添加一個唯一索引消息像這樣:

add_index :messages, [:a, :b, :c], unique: true, name: 'mm_uniqueness' 

然而,我希望列A能夠具有空值而不觸發唯一性約束。

所以:

original a=1, b=2, c=3 
second a=1, b=2, c=3 (not unique) 

original a=null, b=2, c=3 
second a=null, b=2, c=3 (unique) 

怎麼做呢?

回答

0

嘗試創建部分索引:

add_index :messages, [:a, :b, :c], unique: true, name: 'mm_uniqueness', where: 'a != null' 
+4

原來你甚至不需要它。默認情況下,NULL不計入唯一約束。 –

+0

無論如何,'a!= null'總是計算爲NULL,因爲涉及NULL的所有SQL表達式都是NULL。一個更正確的(儘管正如@MatthewBerman所指出的那樣)將是使用'where:'一個不是空'的 – radiospiel