值为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