当值为NULL时,MySQL唯一索引不适用

时间:2014-01-29 17:33:45

标签: mysql sql null unique-key

我有一个用于检测文章视图的表 - 当没有人登录时,每个article_id&&NULL&&IP应该有一个唯一的行,每个article_id&&loggedInUser&&IP都有唯一的行。
所以我认为当没人登录时我只会添加一个NULL而不是user_id。但MySQL让我感到惊讶 - 当我添加了像article_id&&user_id&&IP这样的UNIQUE KEY时,它对于登录用户来说效果很好,但是如果没有用户登录就开始添加像(例如)这样的行:

article_id   |   user_id   |   IP
   5               NULL      192.168.3.50
   5               NULL      192.168.3.50
   5               NULL      192.168.3.50
   5               NULL      192.168.3.50

这看起来并不是很独特 - 我知道它是由NULL引起的但是如何解决这个问题呢?我是否应该依赖于没有用户将user_id为“0”的事实?

感谢。

2 个答案:

答案 0 :(得分:1)

这是故意的,并记录在案: -

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

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

虽然您可以使用0的用户ID,但我担心如果您不希望找到记录,您可能会在其他地方使用0。例如,我经常只将任何输入id字段转换为整数,如果有人试图破解并输入一个字符串,这很可能会被转换为0.在这种情况下,我真的不希望零有意义。< / p>

我可能想在这种情况下设置'无'用户ID。

答案 1 :(得分:0)

您当前的解决方案将会非常迅速地增长并且提供的好处很少。如果是我,我会依靠analytics来处理这类数据。如果你真的想要这个,你可以通过在你的桌子上再加一个字段来计算它。当您要为此外观添加一行已存在的行时。如果有人而不是添加新记录,则只需更新当前记录并增加计数。这将在更小的空间内提供完全相同的信息。