主キーを作成する
適用対象: SQL Server 2016 (13.x) 以降 Azure SQL Database Azure SQL Managed Instance
SQL Server Management Studio または Transact-SQL を使用して、SQL Server データベース エンジンで主キーを定義できます。 主キーを作成すると、対応する一意なクラスター化インデックスが自動的に作成されます。 ただし、主キーは、代わりに非クラスター化インデックスとして指定できます。
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
制限事項
テーブルに含めることができる PRIMARY KEY
制約は 1 つだけです。
PRIMARY KEY
制約内で定義する列はすべて、NOT NULL
として定義する必要があります。 NULL 値を許容するかどうかを指定しない場合、PRIMARY KEY
制約の影響を受けるすべての列は NOT NULL
に設定されます。
アクセス許可
主キーが設定された、新しいテーブルを作成するには、データベースの CREATE TABLE
権限と、テーブルを作成するスキーマの ALTER
権限が必要です。
既存のテーブルに主キーを作成するには、テーブルに対する ALTER
権限が必要です。
SQL Server Management Studio を使用します。
- オブジェクト エクスプローラーで、UNIQUE 制約を追加するテーブルを右クリックし、[デザイン] を選択します。
- テーブル デザイナーで、主キーとして定義するデータベース列の行セレクターを選択します。 複数列を選択する場合は、Ctrl キーを押しながら、他の列の行セレクターを選択します。
- 列の行セレクターを右クリックし、 [主キーの設定]をクリックします。
注意事項
主キーを再定義する場合は、新しい主キーを作成する前に、既存の主キーに対するリレーションシップをすべて削除する必要があります。 再定義中に、既存のリレーションシップが自動的に削除されることを警告するメッセージが表示されます。
主キー列は、行セレクターに主キーの記号で示されます。
主キーが複数の列で構成される場合、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
にクラスター化インデックスを追加します。
クラスター化インデックスを追加するテーブルを作成します。
CREATE TABLE [Production].[TransactionHistoryArchive1] ( CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), TransactionID INT IDENTITY(1, 1) NOT NULL, CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID) );
次に、クラスター化インデックスを追加します。
CREATE CLUSTERED INDEX CIX_TransactionID ON [Production].[TransactionHistoryArchive1] (TransactionID);