我有一个电子邮件专栏,我想是独一无二的。但我也想让它接受空值。我的数据库可以有2个空邮件吗?
当前回答
一个简单的答案是:不,它不会
解释:根据唯一约束的定义(SQL-92)
当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束
这句话可以有两种解释:
没有两行可以有相同的值,即NULL和NULL是不允许的 没有两个非空行可以有值,即NULL和NULL是可以的,但不允许StackOverflow和StackOverflow
由于MySQL遵循第二种解释,UNIQUE约束列中允许有多个NULL值。其次,如果你试图理解SQL中的NULL的概念,你会发现两个NULL值根本不能进行比较,因为SQL中的NULL指的是不可用或未分配的值(你不能将无与无进行比较)。现在,如果您不允许在UNIQUE约束列中有多个NULL值,那么您就收缩了SQL中NULL的含义。我想这样总结我的回答:
MySQL支持UNIQUE约束,但不支持忽略NULL的代价 值
其他回答
是的,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;
结果:
x
NULL
NULL
1
并非所有数据库都是如此。例如,SQL Server 2005及更老版本只允许在具有唯一约束的列中有一个NULL值。
一个简单的答案是:不,它不会
解释:根据唯一约束的定义(SQL-92)
当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束
这句话可以有两种解释:
没有两行可以有相同的值,即NULL和NULL是不允许的 没有两个非空行可以有值,即NULL和NULL是可以的,但不允许StackOverflow和StackOverflow
由于MySQL遵循第二种解释,UNIQUE约束列中允许有多个NULL值。其次,如果你试图理解SQL中的NULL的概念,你会发现两个NULL值根本不能进行比较,因为SQL中的NULL指的是不可用或未分配的值(你不能将无与无进行比较)。现在,如果您不允许在UNIQUE约束列中有多个NULL值,那么您就收缩了SQL中NULL的含义。我想这样总结我的回答:
MySQL支持UNIQUE约束,但不支持忽略NULL的代价 值
避免使用可空的唯一约束。您总是可以将列放在一个新表中,使其非空且惟一,然后仅在有值时填充该表。这确保了对列的任何键依赖都可以正确执行,并避免了可能由空值引起的任何问题。
从文档中可以看出:
一个UNIQUE索引允许多个NULL 可以包含的列的 空”
这适用于除BDB以外的所有发动机。
我不确定作者最初是否只是在问这是否允许重复值,或者这里是否有一个隐含的问题,“如何在使用UNIQUE时允许重复NULL值?”或“如何只允许一个唯一的空值?”
这个问题已经被回答了,是的,你可以在使用UNIQUE索引时拥有重复的NULL值。
因为我在搜索“如何允许一个UNIQUE NULL值”时偶然发现了这个答案。对于其他可能在做同样事情时偶然发现这个问题的人,我剩下的答案是给你的……
在MySQL中,你不能有一个唯一的NULL值,但是你可以有一个唯一的空值,通过插入一个空字符串的值。
警告:数字和字符串以外的类型可能默认为0或其他默认值。
推荐文章
- MySQL对重复键更新在一个查询中插入多行
- 使用{merge: true}设置的Firestore与更新之间的差异
- mysql_connect():[2002]没有这样的文件或目录(试图通过unix:///tmp/mysql.sock连接)在
- 使用电子邮件地址为主键?
- MySQL:如何复制行,但改变几个字段?
- 不能删除或更新父行:外键约束失败
- MongoDB在v4之前不兼容ACID意味着什么?
- Mysql错误1452:不能添加或更新子行:外键约束失败
- 错误:没有唯一的约束匹配给定的键引用表"bar"
- MySQL DISTINCT在GROUP_CONCAT()上
- 第一次设计数据库:我是否过度设计了?
- MySQL选择一个列DISTINCT,与其他列相对应
- 错误1022 -不能写;表中重复的键
- 如何修改列和更改默认值?
- 如何在MySQL 8.0中授予root用户所有权限