Does MySQL ignore null values on unique constraints?
我有一个我想要独特的电子邮件专栏。 但我也希望它接受空值。 我的数据库可以通过这种方式发送2封空邮件吗?
是的,MySQL允许具有唯一约束的列中的多个NULL。
结果:
对于所有数据库都不是这样。例如,SQL Server 2005及更早版本仅允许具有唯一约束的列中的单个NULL值。
-
关于它如何在mysql中的真实性的优秀评论,但不一定是一般的。
-
根据SQLite FAQ,MySQL,PostgreSQL,SQLite,Oracle和Firebird的行为相同。
-
请更新你的答案。 SQLServer 2008+绝对允许它,你只需添加一个WHERE子句......在2017年,无论如何都没有人应该使用旧版本... stackoverflow.com/questions/767657/…
-
这个小功能很难找到答案,不需要在数据库中添加新列或在非常旧的应用程序上升级MySQL。我真的在寻找像Postgres这样的解决方案,我可以使用COALESCE,但似乎答案总是不是它的设计方式。甚至WHERE column IS NOT NULL似乎都没有让我失望,因为我的MySQL版本不支持它。谁知道我在哪里看?
来自文档:
"a UNIQUE index permits multiple NULL
values for columns that can contain
NULL"
这适用于除BDB之外的所有引擎。
-
当前的mysql版本不再提供BDB(从5.1.12开始)。
-
我的测试似乎表明了Java Derby数据库v10.13.1.1。类似地,在具有唯一索引的列中仅允许一个null。
我不确定作者最初只是在询问是否允许重复值,或者是否有一个隐含的问题在这里询问"如何在使用UNIQUE时允许重复的NULL值?"或者"如何只允许一个UNIQUE NULL值?"
问题已经得到解答,是的,您在使用UNIQUE索引时可以有重复的NULL值。
因为我在搜索"如何允许一个UNIQUE NULL值时偶然发现了这个答案"。对于其他可能在做同样事情时偶然发现这个问题的人,其余的答案都是给你的......
在MySQL中,您不能有一个UNIQUE NULL值,但是通过插入空字符串的值可以有一个UNIQUE空值。
警告:除字符串以外的数字和类型可能默认为0或其他默认值。
-
约束与索引无关。事实上,尽管没有其他这样的行,你甚至不能拥有一个具有NULL值的行。
-
@Pijusn你的意思是"约束与索引无关?"关于你的第二句话,我从来没有说你可以有一个NULL值的行,这就是为什么我在帖子的开头说,只有当他没有设置使用空值时,这是一个解决方案。
-
我的意思是添加新元素失败不是因为UNIQUE约束而是因为NOT NULL约束。我认为这个答案与问题无关,因为问题具体是关于UNIQUE约束的行为。
-
@Pijusn我找到了你。你是对的,我已经删除了另外提出的措辞。我误读了这个问题。但我相信答案仍然可能对那些偶然发现这个问题的用户有用,就像我在尝试找到一种方法来获得一个独特的"无"值时所做的那样,但错误地允许无效能力。
-
我觉得这个答案很有用;我需要在3个参数上唯一标识用户,但根据第二个参数的值,第三个参数是可选的。我需要做Rails验证。
-
我觉得这个答案很有用。但是,这里也回答了。这篇文章是我的谷歌搜索的第一个结果,虽然这个答案和链接的问题是我正在寻找的。
避免可空的唯一约束。您始终可以将列放在新表中,使其为非null且唯一,然后仅在您拥有该值时才填充该表。这可确保可以正确实施对列的任何键依赖性,并避免可能由null引起的任何问题。
-
是的,但你提出的建议几乎就是mysql在幕后所做的事情。如果内置此功能,为什么要重新发明轮子?
-
因为它不是有效的SQL。我相信这个技巧对所有想要(或需要)数据库无关设计的人都有用。
-
@ Arsen7如果您有多个业务 - 每个业务都有多个客户端,该怎么办?您将所有业务与其客户的电子邮件地址存储在一个文件中。因此,您不能使email_address唯一,因为不同的企业可能拥有相同的客户端。因此,您必须创建business_id和email_address的复合唯一索引。是否有可能把它放在一张新表中 - 正如所解释的那样?
-
@GerhardLiebenberg,当然可以。
-
我有一个案例,其中"电子邮件"列需要唯一或null。如果我遵循你的建议,我必须创建一个包含单个"电子邮件"列的新表。依赖于这种Mysql特定的行为要容易得多,结果也是一样的。客户不关心我是否将电子邮件存储在新表中。此外,数据库不可知设计经常被高估。对于很多项目,你不能也可能不会轻易地从一个数据库切换到另一个数据库。