我注意到,如果我有两个列的唯一复合键,column_a和column_B,那么如果其中一个列为空,我的sql就会忽略这个约束。例如:如果column_a=1且column_B = null,我可以随意插入column_a=1且column_b=null如果column_a=1且column_B = 2,则只能插入一次该值。除了将列更改为Not Null并设置默认值之外,是否还有其他方法可以应用此约束?
ibps3vxo1#
http://dev.mysql.com/doc/refman/5.0/en/create-index.html“UNIQUE索引创建了一个约束,使得索引中的所有值必须是不同的。如果尝试添加新行的键值与现有行匹配,则会发生错误。此约束不适用于NULL值,BDB存储引擎除外。对于其他引擎,UNIQUE索引允许包含NULL的列具有多个NULL值。所以,不,你不能让MySQL将NULL视为唯一值。我想你有几个选择:你可以按照你的问题中的建议去做,存储一个“特殊值”而不是null,或者你可以对这个表使用BDB引擎。不过,我不认为这种行为上的微小差异会导致对存储引擎做出不寻常的选择。
w8f9ii692#
我通过在COALESCE(column_b, 0)的同一个表上创建一个虚拟(存储)列来解决这个问题。然后,我基于该列(和第二列)创建了我的唯一复合索引。效果很好。当然,这在2010年可能是不可能的:)
COALESCE(column_b, 0)
2条答案
按热度按时间ibps3vxo1#
http://dev.mysql.com/doc/refman/5.0/en/create-index.html
“UNIQUE索引创建了一个约束,使得索引中的所有值必须是不同的。如果尝试添加新行的键值与现有行匹配,则会发生错误。此约束不适用于NULL值,BDB存储引擎除外。对于其他引擎,UNIQUE索引允许包含NULL的列具有多个NULL值。
所以,不,你不能让MySQL将NULL视为唯一值。我想你有几个选择:你可以按照你的问题中的建议去做,存储一个“特殊值”而不是null,或者你可以对这个表使用BDB引擎。不过,我不认为这种行为上的微小差异会导致对存储引擎做出不寻常的选择。
w8f9ii692#
我通过在
COALESCE(column_b, 0)
的同一个表上创建一个虚拟(存储)列来解决这个问题。然后,我基于该列(和第二列)创建了我的唯一复合索引。效果很好。当然,这在2010年可能是不可能的:)