共用方式為


建立主索引鍵

適用於:SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體

您可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 資料庫引擎中定義主索引鍵。 建立主索引鍵會自動建立對應的唯一叢集索引。 不過,主索引鍵可以改為指定為非叢集索引。

本文 Transact-SQL 程式碼範例使用 AdventureWorks2022AdventureWorksDW2022 範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。

限制

一份資料表只能有一個 PRIMARY KEY 條件約束。

PRIMARY KEY 條件約束內所定義的所有資料行,都必須定義成 NOT NULL。 如果未指定可 NULL 性,參與 PRIMARY KEY 條件約束的所有資料行可 NULL 性都會設成 NOT NULL

權限

建立具有主索引鍵的新資料表,需要資料庫中的 CREATE TABLE 權限及建立資料表的結構描述之 ALTER 權限。

在現有資料表中建立主索引鍵需要此資料表的 ALTER 權限。

使用 SQL Server Management Studio

  1. 在物件總管中,以滑鼠右鍵按一下要加入 Unique 條件約束的資料表,然後選取 [設計]
  2. 在 [資料表設計工具] 中,選取要定義為主索引鍵的資料庫資料行的資料列選取器。 若要選取多個資料行,請按住 CTRL 鍵,同時選取其他資料行的資料列選取器。
  3. 在資料行的資料列選取器中,按一下滑鼠右鍵,然後選取 [設定主索引鍵]

警告

若要重新定義主索引鍵,必須在建立新的主索引鍵前,先刪除所有現有主索引鍵的關聯性。 出現訊息警告您,這個程序中會自動刪除現有的關聯性。

主索引鍵資料行是由資料列選取器中的主索引鍵符號識別。

如果主索引鍵由一個以上的資料行組成,一個資料行中允許有重複的值,但是主索引鍵中所有資料行的組合值必須是唯一的。

如果您定義了複合索引鍵,主索引鍵中的資料行順序必須符合資料表所顯示的資料行順序。 然而,您可以在建立主索引鍵之後變更資料行的順序。 如需詳細資訊,請參閱 修改主索引鍵

使用 Transact-SQL

在現有的資料表中建立主索引鍵

下列範例會在 AdventureWorks2022 資料庫的 TransactionID 資料行上建立主索引鍵。

ALTER TABLE [Production].[TransactionHistoryArchive]
   ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID);

在新的資料表中建立主索引鍵

下列範例會建立一個資料表,並在 AdventureWorks2022 資料庫的 TransactionID 資料行上定義主索引鍵。

CREATE TABLE [Production].[TransactionHistoryArchive1] (
    TransactionID INT IDENTITY(1, 1) NOT NULL,
    CONSTRAINT PK_TransactionHistoryArchive1_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
);

在新資料表中另外建立具有叢集索引的非叢集主索引鍵

下列範例會在 AdventureWorks2022 資料庫中建立資料表,CustomerID 資料行上有非叢集主索引鍵。 然後,它會在 TransactionID 新增叢集索引。

  1. 建立資料表,新增叢集索引。

    CREATE TABLE [Production].[TransactionHistoryArchive1] (
        CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),
        TransactionID INT IDENTITY(1, 1) NOT NULL,
        CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID)
    );
    
  2. 現在新增叢集索引。

    CREATE CLUSTERED INDEX CIX_TransactionID
    ON [Production].[TransactionHistoryArchive1] (TransactionID);