Primary-Key

主鍵是否只包含一個 Null 值…?

  • March 5, 2021

我的工作

  • 主鍵是唯一的,並且只有一個包含一個表。
  • 表中可以包含許多唯一鍵。
  • 在 SQL Server 中,主鍵不是 Nullable。但是,唯一鍵可能只包含一個空值。

我的問題:

實際上,在 SQL Server 中,主鍵不可為空。但是從理論上講,當唯一鍵中允許 Null 值時,為什麼我們不能在鍵中只有一個 Null 值呢?

謝謝回答我的問題

很抱歉問了一個一般性問題,在閱讀了答案後,我對 DB 中的空值有了一個清晰的認識。

此外,我對 C++、Jave 等程式語言感到困惑,其中 null 值可以比較。在做了一些工作之後,我明白 Null 在 SQL 中是不可比的。

在 C++ 等程式語言中,Jave…

Null==Null 

返回 TRUE

但是,在 SQL

Null==Null 

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

作為鍵的一部分的任何屬性都不能包含空值;如果一列可以為空,則它不是任何鍵的一部分。由 UNIQUE 或 PRIMARY KEY 約束定義的列集也不是鍵,除非它是最小超鍵且不可為空

為什麼鍵不能允許空值?有很多潛在的原因:

  1. 鍵是一個關係概念,而空值(正如我們今天所知道的)本質上是幾年後出現的 SQL 發明。SQL DBMS 與關係 DBMS 不同。
  2. Null 不是值,因此它們不是鍵值。空值是未指定值的標記。
  3. 密鑰應該是不可約的(最小的) - 換句話說,密鑰的所有組件都需要生成超級密鑰。由於 null 意味著缺少某些組件,因此它與鍵的最基本定義相矛盾。
  4. 在標準 SQL 中,如果任何列允許空值,則唯一性約束不會強制唯一性。
  5. SQL DBMS 還允許在其他約束中使用空值(PRIMARY KEY 除外):FOREIGN KEY、CHECK、ASSERTION。空值從不違反約束,因此空值作為一種“退出子句”來保證數據完整性。假設地,如果在鍵中允許空值,那麼這似乎意味著一種更嚴格的引用完整性形式,除非父表中有相應的空鍵,否則不允許在外鍵中出現空值。在這種情況下,每個可以為空的外鍵都必須引用一個可以為空的鍵,並且不能引用一個不可為空的鍵。
  6. 現實中沒有空值,在日常數學或邏輯中;它們只是 SQL 中的一個程式特性,並不是特別“數學”,甚至在它們的工作方式上也不是一致的。不要尋找更多原因:空值的工作方式只是因為 SQL 的設計者這麼說。

引用自:https://dba.stackexchange.com/questions/268677