2017-04-12 38 views
1

如果我錯了,請更正。請向我指出關於這個概念的文章。SQL中的主鍵,索引和約束條件

當我們創建一個主鍵時,在後臺會自動創建一個唯一的索引,聚簇索引和一個非空約束。

這是否也意味着如果我們創建非空約束,[聚集索引或非聚集索引]和列上的唯一索引,那麼該列將成爲主鍵?

我想了解主鍵,索引和約束之間的核心概念/關係。

+0

Microsoft SQL SERVER – variable

回答

1

主鍵是被聲明爲「主」鍵之一。只有具備這些特點並不能成爲關鍵的「主要」。它必須被明確地聲明。

不同的數據庫以不同的方式實現主鍵。雖然主鍵通常使用聚簇唯一索引實現,但這不是必需的。

主鍵正是顧名思義:「主」。任何其他列或列組都可以聲明爲uniquenot null。這不會使他們成爲主鍵。在某些數據庫中,甚至可以定義另一列或一組列,如not null,unique集羣 - 沒有那個主鍵。

總結:

  • 你可以有任意數量的表上唯一索引。
  • 您可以在表上的非NULL列上擁有任意數量的唯一索引。
  • 您最多隻能有一個聚簇索引。在幾乎所有情況下,這將是主要關鍵。但並非所有數據庫都需要。
  • 最多隻能有一個主鍵。在幾乎所有情況下,這都會聚集在一起,儘管這在所有數據庫中都不是必需的。

有關更多詳細信息,請參閱您正在使用的數據庫的文檔。

如果您有多個包含非NULL唯一鍵的列,那麼只有一列是「主」 - 即已被顯式聲明爲主鍵的列。

爲什麼你會有一個非羣集主鍵?我可以舉一個場景。設想一個數據庫,其中UUID是行的關鍵字。該公司不希望使用自動生成的序列號,因爲它們提供了號碼中的信息。

但是,對於集羣索引而言,UUID是非常差的候選對象,因爲插入幾乎不會結束。在這種情況下,您可能希望使用集羣自動生成的順序鍵來設計表,以加快插入速度您可以將此鍵設爲主鍵。但是,您希望所有外鍵引用都使用UUID,並且您希望所有外鍵引用都是表的主鍵。

+0

我的問題只涉及一列。我以爲我很清楚。我的問題現在有意義嗎? – variable

+0

@variable,Gordon已經指定PK應該明確聲明 – LONG

+0

謝謝。那麼爲什麼反之亦然呢? – variable

0

所有列可以用Not nullNon-clustered indexUnique但只有ONE欄添加可以PK。

Unique允許NULLPrimary Key不允許。

你可能會談論Candidate Key,這裏是裁判: https://www.techopedia.com/definition/21/candidate-key

+0

如果唯一索引或約束是否唯一,您能否提供建議? – variable

+0

你是什麼意思?我不明白大聲笑 – LONG

+0

在後臺 - 是一個唯一的鍵實現爲索引或約束? – variable