主键是否只包含一个 Null 值...?

Lok*_*ddy 1 primary-key dbms unique-constraint

我的工作

  • 主键是唯一的,并且只有一个包含表。

  • 表中可以包含许多唯一键。

  • 在 SQL Server 中,主键不可为 Null。但是,唯一键可能只包含一个空值。

我的问题:

实际上,在 SQL Server 中,主键不可为空。但是从理论上讲,当它允许唯一键中的 Null 值时,为什么我们不能在键中只有一个 Null 值呢?

谢谢回答我的问题

很抱歉问了一个一般性问题,在阅读了答案后,我对 DB 中的空值有了一个清晰的了解。

此外,我对 C++、Jave 等编程语言感到困惑,在这些语言中,空值可以进行比较。做了一些工作后,我明白Null 在SQL 中是没有可比性的。

在 C++、Java 等编程语言中...

Null==Null 
Run Code Online (Sandbox Code Playgroud)

返回真

但是,在 SQL 中

Null==Null 
Run Code Online (Sandbox Code Playgroud)

返回 FALSE,因为 Null 值是未知的,它可以是任何值。

nvo*_*gel 9

作为键的一部分的任何属性都不能包含空值;如果一列可以为空,那么它不是任何键的一部分。同样的情况是由 UNIQUE 或 PRIMARY KEY 约束定义的列集不是键,除非它是最小超键并且也是不可为空的

为什么键不能允许空值?有很多潜在的原因:

  1. 键是一个关系概念,而空值(正如我们今天所知)本质上是几年后出现的 SQL 发明。SQL DBMS 与关系 DBMS 不同。
  2. Null 不是值,因此它们不是键值。空值是未指定值的标记。
  3. 密钥应该是不可约的(最小的)——换句话说,密钥的所有组件都需要制作超级密钥。由于 null 意味着缺少某些组件,因此它与键的最基本定义相矛盾。
  4. 在标准 SQL 中,如果任何列允许空值,则唯一性约束不会强制唯一性。
  5. SQL DBMS 还允许其他约束(主键除外)中的空值:FOREIGN KEY、CHECK、ASSERTION。空值永远不会违反约束,因此空值充当一种数据完整性的“退出条款”。假设,如果键中允许空值,那么这似乎意味着更严格的参照完整性形式,除非父表中有相应的空键,否则外键中不允许空值。在这种情况下,每个可为空的外键都必须引用一个可为空的键,而不能引用一个不可为空的外键。
  6. 现实中没有零点,在日常数学或逻辑中;它们只是 SQL 中的一个编程特性,并不是特别“数学”,甚至在它们的工作方式上也不是一致的。不要寻找更多的原因:空值的工作方式只是因为 SQL 的设计者是这样说的。