MySQL是否在唯一约束上忽略空值?

Hug*_*ota 254 mysql database

我有一个我想要独特的电子邮件专栏.但我也希望它接受空值.我的数据库可以通过这种方式发送2封空邮件吗?

Mar*_*ers 371

是的,MySQL允许具有唯一约束的列中的多个NULL.

CREATE TABLE table1 (x INT NULL UNIQUE);
INSERT table1 VALUES (1);
INSERT table1 VALUES (1);   -- Duplicate entry '1' for key 'x'
INSERT table1 VALUES (NULL);
INSERT table1 VALUES (NULL);
SELECT * FROM table1;
Run Code Online (Sandbox Code Playgroud)

结果:

x
NULL
NULL
1
Run Code Online (Sandbox Code Playgroud)

对于所有数据库都不是这样.例如,SQL Server 2005及更早版本仅允许具有唯一约束的列中的单个NULL值.

  • 关于它如何在mysql中的真实性的优秀评论,但不一定是一般的. (30认同)
  • 根据[SQLite FAQ](https://sqlite.org/faq.html#q26),在MySQL,PostgreSQL,SQLite,Oracle和Firebird中,行为_**是相同的. (10认同)
  • 请更新你的答案.SQLServer 2008+绝对允许它,你只需要添加一个WHERE子句......在2017年,没有人应该使用比2008年更旧的版本... /sf/ask/53736021/ -i创建-一个唯一的约束,也就是说,还-让 - 空/ 767702#767702 (4认同)
  • 注意:这也适用于具有更多列的唯一索引。因此,如果您希望 a、b 和 c 列是唯一的,您仍然可以在表中包含带有 null、b、c 的双行 (2认同)

Mat*_*hen 102

来自文档:

"UNIQUE索引允许包含NULL的列的多个NULL值"

这适用于除BDB之外的所有引擎.

  • 当前的mysql版本不再提供BDB(从5.1.12开始). (3认同)

blu*_*991 6

我不确定作者最初只是在询问是否允许重复值,或者是否有一个隐含的问题在这里询问"如何NULL在使用时允许重复值UNIQUE?" 或者"如何只允许一个UNIQUE NULL值?"

问题已经得到解答,是的,您NULL在使用UNIQUE索引时可以有重复的值.

因为我在搜索"如何允许一个UNIQUE NULL值"时偶然发现了这个答案.对于其他可能在做同样事情时偶然发现这个问题的人,其余的答案都是给你的......

在MySQL中,您不能拥有一个UNIQUE NULL值,但是UNIQUE通过插入空字符串的值可以获得一个空值.

警告:除字符串以外的数字和类型可能默认为0或其他默认值.


Aks*_*iha 6

一个简单的答案是: No, it doesn't

说明:根据唯一约束的定义(SQL-92)

当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束

该声明可以有两种解释:

  • 两行都不具有相同的值,即NULLNULL不允许
  • 没有两个非空行可以有值,即NULLNULL是好的,但StackOverflowStackOverflow不允许

由于 MySQL 遵循第二种解释,因此约束列NULL中允许有多个值UNIQUE。其次,如果您尝试理解NULLSQL 中的概念,您会发现NULL根本无法比较两个值,因为NULLSQL 中指的是不可用或未分配的值(您不能将空与空进行比较)。现在,如果您不允许NULLUNIQUE约束列中使用多个值,那么您就是在收缩NULLSQL 中的含义。我会总结我的回答说:

MySQL 支持 UNIQUE 约束,但不以忽略 NULL 值为代价

  • 只有一种可能的解释...当且仅当表中没有两行在唯一列中具有相同的****非空值****时,才满足唯一约束 (2认同)

nvo*_*gel 5

避免可为空的唯一约束。您始终可以将列放在新表中,使其变为非空且唯一,然后仅在具有值时填充该表。这样可以确保对列的任何键依赖关系都可以正确实施,并避免了可能由null引起的任何问题。

  • 是的,但是您提出的建议几乎完全是mysql在幕后所做的事情。如果内置此功能,为什么还要重新发明轮子呢? (5认同)
  • 我遇到“电子邮件”列需要唯一或为空的情况。如果我要听从您的建议,则必须用一个“电子邮件”列创建一个新表。依赖于此Mysql特定的行为要容易得多,并且结果是相同的。客户不在乎我是否将电子邮件存储在新表中。而且,数据库不可知论的设计经常被高估。对于许多项目,您不能而且很可能不会轻易地从一个数据库切换到另一个数据库。 (3认同)
  • 因为它不是有效的SQL。我相信,该技巧对所有想要(或需要)数据库不可知设计的人都是有用的。 (2认同)