Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
值为NULL时,MySQL唯一索引不适用_Mysql_Sql_Null_Unique Key - Fatal编程技术网

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

值为NULL时,MySQL唯一索引不适用,mysql,sql,null,unique-key,Mysql,Sql,Null,Unique Key,我有一个用于检测文章视图的表-当没有人登录时,每个文章id&&NULL&&IP应该有一个唯一的行,每个文章id&&loggedInUser&&IP应该有一个唯一的行所以我想,当没有人登录时,我只会添加一个NULL而不是user\u id。但是MySQL让我吃惊-当我添加了像article\u id&&user\u id&&IP这样的唯一密钥时,它对登录用户来说效果很好,但是如果没有用户登录,它就会开始添加行,例如: 这似乎不是很独特-我知道它是由NULL引起的,但是如何解决这个问题呢?我是否应该

我有一个用于检测文章视图的表-当没有人登录时,每个
文章id&&NULL&&IP
应该有一个唯一的行,每个
文章id&&loggedInUser&&IP
应该有一个唯一的行
所以我想,当没有人登录时,我只会添加一个NULL而不是user\u id。但是MySQL让我吃惊-当我添加了像
article\u id&&user\u id&&IP这样的唯一密钥时,它对登录用户来说效果很好,但是如果没有用户登录,它就会开始添加行,例如:

这似乎不是很独特-我知道它是由NULL引起的,但是如何解决这个问题呢?我是否应该依赖这样一个事实,即没有用户将拥有用户id“0”


谢谢。

您当前的解决方案将以非常快的速度发展壮大,但带来的好处微乎其微。如果是我,我就只能依靠它来处理这类数据。如果您真的想这样做,可以通过在表中添加一个字段来进行计数,这非常容易。当您准备向该行添加行时,请查找已存在的行。如果这样做了,则只需更新当前记录并增加计数即可,而无需添加新记录。这将在更少的空间内提供完全相同的信息。

这是有意为之,并记录在案:-

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

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


在这种情况下,我可能会设置一个“none”用户标识来使用。

您可以将create table语法放在info中吗?这是有意的,并有文档记录-“唯一索引允许包含NULL的列有多个NULL值”。我可能会使用0,或者设置一个“none”用户标识,以防您出于其他目的使用0(即,如果有人在玩游戏,我通常会将数字标识输入字段转换为其int等效值,该值可能为0,然后我可能不希望0有效)@Kickstart请详细描述一下整个问题-这可能是一个很好的答案:)您可以为空用户使用一个特殊的id。。。例如,0?@Perroloco很好,谢谢,但我已经在我的问题中提出:D1)它不能被黑客攻击,因为它是纯PHP内部的东西2)即使如此,它也会被算作未链接的用户-这很好3)因为“没有”,我已经考虑过了,但在我看来,它似乎与整数保持一致,不过,感谢您的深入描述:)只是意味着,如果有人攻击脚本并成功传递了转换为0的内容,您可能会向他们显示真实数据。至于none,我指的是普通用户的用户记录。可以是id 1或任何其他号码。
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