【问题标题】:SQL : Is it possible to store duplicate null values in a column with unique constraintSQL:是否可以在具有唯一约束的列中存储重复的空值
【发布时间】:2014-09-27 19:23:18
【问题描述】:

您如何根据空值定义唯一约束? 所有数据库是否有任何标准允许在唯一列中使用空值。

【问题讨论】:

标签: sql database unique


【解决方案1】:

引用自blog,这里是一些 DBMS 中具有 UNIQUE 约束的列中允许的 NULL 值的数量:

其他 DBMS 做什么

Trudy Pelzer 和我在我们的《SQL 性能》一书的第 260 页上写了这篇文章 调整:DBMS 存在 UNIQUE 时的最大 NULL 数 约束

IBM (DB2) One

Informix One

入口归零

基间零

Microsoft (SQL Server) One

MySQL 很多 [虽然 BDB 存储引擎是个例外]

甲骨文很多

Sybase One

按预期在 Sql Server(至少 2012 Express)中尝试以下代码失败:

DECLARE @T TABLE
(
    value int unique
)
INSERT INTO @T VALUES(1)
INSERT INTO @T VALUES(2)
INSERT INTO @T VALUES(NULL)
INSERT INTO @T VALUES(NULL)

文章中提到处理具有唯一约束的列中的空值的正确规则应该是任何两行的唯一列的值,如果两者都不为NULL,则不应相等。

也就是说,非空值必须是唯一的,并且允许多个空值。

但似乎并非所有 DBMS 都应用该规则,因此最好通过简单的测试来确认。

【讨论】:

    【解决方案2】:

    "...一个 UNIQUE 列可以在一行中有多个 NULL,除非您显式地为每一列添加 NOT NULL 约束。"

    Joe Celko 的“Smarties 的 SQL”,第 2 版,第 16 页。

    要获得 NULL-s 的乐趣,请尝试以下方法:

    SELECT 1 = NULL (返回NULL

    SELECT 1 IS NULL (返回FALSE

    【讨论】:

      【解决方案3】:

      这取决于数据库引擎。 MySQL 允许空重复,但 SQL Server 不允许。

      你可以在SQLFiddle 上试试这个。 MySQL为用户'ddd'返回异常,而MySQL为用户'ccc'返回异常

      CREATE TABLE users (
        username varchar(20) NOT NULL,
        id int unique
      );
      
      insert into users values ('aaa', null);
      insert into users values ('bbb', 1);
      insert into users values ('ccc', null);
      insert into users values ('ddd', 1);
      

      【讨论】:

        猜你喜欢
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多