MySql复合键和空值

ste*_*bot 16 mysql sql null unique

我注意到如果我有两列(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并设置默认值?

Ham*_*ite 18

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

"UNIQUE索引创建一个约束,使索引中的所有值必须是不同的.如果您尝试添加一个键值与现有行匹配的新行,则会发生错误.此约束不适用于NULL值,除了BDB存储引擎.对于其他引擎,UNIQUE索引允许包含NULL的列的多个NULL值."

所以,不,你不能让MySQL将NULL视为唯一值.我想你有几个选择:你可以在你的问题中做你建议的并存储一个"特殊值"而不是null,或者你可以使用BDB引擎作为表.我不认为这种微小的行为差异可能会使存储引擎做出不同寻常的选择.


Bre*_*uir 5

我通过在同一个表上创建一个虚拟(存储)列来解决这个问题COALESCE(column_b, 0)。然后,我根据该列(和第二列)创建了唯一的复合索引。效果很好。

当然,这在 2010 年可能是不可能的:)