【发布时间】:2013-05-01 06:10:43
【问题描述】:
似乎在 SQL Server 中,唯一索引将 NULL 视为“只是另一个值”,而不是在 SQL 的其余部分中与 NULL 的比较返回 NULL。
假设您有一个表 (t),在可空列 K 上有一个唯一索引:
K V
0 32
1 12
3 45
一切都好。
但它也会允许
K V
0 32
1 12
3 45
NULL 89 <-- Baaad
反之亦然,它还将允许以下操作:
K V
NULL 89
0 32 <-- not good
我可以看到这可能是一场潜在的灾难,因为我使用 NULL 键值来表示无法进一步细分的值 - 总计和细分会导致重复计算或不一致。
我可以找到看似数千个问题,其中人们想要做相反的事情(允许多个 NULL),但没有一个想要将 NULL 视为 NULL。
如何让 SQL Server 在唯一索引中将 NULL 视为 NULL(并且只允许一个 NULL 或列中有任意数量的唯一值)?
【问题讨论】:
-
我不清楚您真正在寻找什么行为。您使用短语“将 NULL 视为 NULL”就好像它应该是显而易见的,只是从短语中,但对我来说,它不是。我也发现你的第二个例子不清楚。
-
SQL-Server 允许在具有唯一约束的列中最多有一个
NULL。另一个 DBMS(在这种情况下符合标准)允许多个 Null。您可以通过创建唯一的部分索引来绕过它,但我认为这不是您的目标。根本不清楚你的目标到底是什么。 -
在我看来,与
NULL的任何比较都应该产生NULL,因此如果一列只包含一个NULL,则所有与任何其他值(包括NULL)的比较都应该失败。我可以看到“乐观”并假设NULLs 代表独特的未知数可能很有用,但在我的情况下,这将是悲观的并确保数据库的完整性。 -
根据标准,与
NULL比较产生UNKNOWN,而不是NULL。这是一个小问题,但如果我们在 SQL 中有一个“布尔”数据类型,我们希望能够将该类型的列设置为TRUE、FALSE、UNKNOWN或 i>(如果它可以为空)NULL。只有(据我所知)MySQL 将NULL和UNKNOWN混为一谈。 -
我使用 MS SQL,但我对标准一无所知 :P 说真的,我认为许多文档过度简化了 NULL 处理,以至于他们给你留下了一个不完整的心智模型。
标签: sql sql-server null unique-constraint