主キーを作成する

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL DatabaseAzure SQL Managed Instance

SQL Server Management Studio または Transact-SQL を使用して、SQL Server データベース エンジンで主キーを定義できます。 主キーを作成すると、対応する一意なクラスター化インデックスが自動的に作成されます。 ただし、主キーは、代わりに非クラスター化インデックスとして指定できます。

この記事には AdventureWorks2022 サンプル データベースが必要です。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。

制限事項

テーブルに含めることができる PRIMARY KEY 制約は 1 つだけです。

PRIMARY KEY 制約内で定義する列はすべて、NOT NULL として定義する必要があります。 NULL 値を許容するかどうかを指定しない場合、PRIMARY KEY 制約の影響を受けるすべての列は NOT NULL に設定されます。

アクセス許可

主キーが設定された、新しいテーブルを作成するには、データベースの CREATE TABLE 権限と、テーブルを作成するスキーマの ALTER 権限が必要です。

既存のテーブルに主キーを作成するには、テーブルに対する ALTER 権限が必要です。

SQL Server Management Studio を使用する

  1. オブジェクト エクスプローラーで、UNIQUE 制約を追加するテーブルを右クリックし、[デザイン] を選択します。
  2. テーブル デザイナーで、主キーとして定義するデータベース列の行セレクターを選択します。 複数列を選択する場合は、Ctrl キーを押しながら、他の列の行セレクターを選択します。
  3. 列の行セレクターを右クリックし、 [主キーの設定]をクリックします。

注意事項

主キーを再定義する場合は、新しい主キーを作成する前に、既存の主キーに対するリレーションシップをすべて削除する必要があります。 再定義中に、既存のリレーションシップが自動的に削除されることを警告するメッセージが表示されます。

主キー列は、行セレクターに主キーの記号で示されます。

主キーが複数の列で構成される場合、1 つの列では重複した値が許可されますが、主キーのすべての列の値の組み合わせは一意である必要があります。

複合キーを定義する場合は、主キーの列の順序が、テーブルに表示される列の順序と同じになります。 ただし、主キー作成後に列の順序を変更することもできます。 詳細については、「 主キーの変更」を参照してください。

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);