主キーの作成

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

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

はじめに

制限事項と制約事項

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

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

セキュリティ

アクセス許可

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

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

SQL Server Management Studio の使用 [SQL Server]

主キーを作成する

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

注意事項

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

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

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

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

Transact-SQL の使用

既存のテーブルに主キーを作成する

次の例では、AdventureWorks データベースの列 TransactionID に主キーを作成します。

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

新しいテーブルに主キーを作成する

次の例では、AdventureWorks データベース内で、テーブルを作成して列 TransactionID に主キーを定義します。

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

新しいテーブルにクラスター化インデックス付きの主キーを作成する

次の例では、AdventureWorks データベース内で、テーブルを作成して CustomerID 列に主キーを、TransactionID にクラスター化インデックスを定義します。

-- Create table to add the clustered index
CREATE TABLE Production.TransactionHistoryArchive1
   (
      CustomerID uniqueidentifier DEFAULT NEWSEQUENTIALID()
      , TransactionID int IDENTITY (1,1) NOT NULL
      , CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID)
   )
;

-- Now add the clustered index
CREATE CLUSTERED INDEX CIX_TransactionID ON Production.TransactionHistoryArchive1 (TransactionID);

次のステップ