この記事では、Transact-SQLを使用してテーブルを作成するときにSQLServerで主キーを作成する方法について説明します。
主キーは、特定のテーブルの一意の識別子として構成されている1つ以上の列です。主キーを使用して、テーブル内のデータの整合性を強化できます。
テーブルに含めることができる主キーは1つだけであり、主キーはNOT NULL
として定義されている列にのみ追加できます。 。
この記事では、 newで主キーを作成する方法について説明します。 テーブル(つまり、テーブルを作成するとき)。 既存に主キーを作成する必要がある場合 表については、SQLServerの既存のテーブルに主キーを追加する方法を参照してください。
例1-主キーを使用してテーブルを作成する
まず、テストデータベースを作成します:
CREATE DATABASE PK_Test;
次に、主キー制約を含む新しいテーブルを作成します。
USE PK_Test; CREATE TABLE Colors ( ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY, ColorName varchar(50) );
これにより、Colors
という新しいテーブルが作成されました ColorId
に主キー制約があります 桁。
例2–主キーの制約を確認する
次のコードを実行して、データベース内の主キー制約のリストを返すことができます。
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
結果:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__Colors__8DA7674DD34F4585 | PK | 1 | 1 | +------------------------------+--------+-------------------+-------------------+
この例では、列を絞り込みました。 sys.key_constraints
システムビューはこれより多くの列を返します。いつでも*
を使用できます 必要に応じてすべての列を返すワイルドカード。
クエリ結果から、このデータベースには主キーが1つしかないことがわかります(作成したばかりのキー)。
この場合、主キーはシステムによって自動的に名前が付けられました。自分の名前を指定することもできます(これについては後で詳しく説明します)。
例3–インデックスを確認する
デフォルトでは、主キーを作成するときにクラスター化インデックスが作成されます。クラスタ化インデックスを明示的に指定することも、自動的に作成することもできます。非クラスター化インデックスを指定するオプションもあります。
上記の主キーを作成したときに自動的に作成されたインデックスを返すクエリは次のとおりです。
SELECT * FROM sys.indexes WHERE name = 'PK__Colors__8DA7674DD34F4585';
結果(垂直出力を使用):
object_id | 885578193 name | PK__Colors__8DA7674DD34F4585 index_id | 1 type | 1 type_desc | CLUSTERED is_unique | 1 data_space_id | 1 ignore_dup_key | 0 is_primary_key | 1 is_unique_constraint | 0 fill_factor | 0 is_padded | 0 is_disabled | 0 is_hypothetical | 0 is_ignored_in_optimization | 0 allow_row_locks | 1 allow_page_locks | 1 has_filter | 0 filter_definition | NULL compression_delay | NULL suppress_dup_key_messages | 0 auto_created | 0
この場合、作成した主キーと同じ名前を含む行だけに結果を絞り込みました。 WHERE
はいつでも削除できます より多くの結果を返す必要がある場合は、句。
このインデックスには type_desc があることがわかります CLUSTERED の 。
例4–主キーの命名
上で作成した主キーは、システムによって自動的に名前が付けられました。必要に応じて、独自の名前を指定できます。
主キーの名前を指定する例を次に示します。この場合、非クラスター化インデックスも指定します。
USE PK_Test; CREATE TABLE Cats ( CatId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_Cats_CatId PRIMARY KEY NONCLUSTERED (CatId), CatName varchar(50) );
この場合、オプションのCONSTRAINT
を使用します 主キーの定義の開始を示すキーワードと、それに続く主キーの選択した名前。 NONCLUSTERED
も使用しています 非クラスター化インデックスを指定するキーワード。
主キーを確認してください:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
結果:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__Colors__8DA7674DD34F4585 | PK | 1 | 1 | | PK_Cats_CatId | PK | 2 | 0 | +------------------------------+--------+-------------------+-------------------+
インデックスを確認してください:
SELECT * FROM sys.indexes WHERE name = 'PK_Cats_CatId';
結果(垂直出力を使用):
object_id | 917578307 name | PK_Cats_CatId index_id | 2 type | 2 type_desc | NONCLUSTERED is_unique | 1 data_space_id | 1 ignore_dup_key | 0 is_primary_key | 1 is_unique_constraint | 0 fill_factor | 0 is_padded | 0 is_disabled | 0 is_hypothetical | 0 is_ignored_in_optimization | 0 allow_row_locks | 1 allow_page_locks | 1 has_filter | 0 filter_definition | NULL compression_delay | NULL suppress_dup_key_messages | 0 auto_created | 0
したがって、今回は type_desc NONCLUSTERED です 。
テーブルを作成するときは、CLUSTERED
に注意してください。 1つの制約に対してのみ指定できます。 UNIQUE
に指定されている場合 制約とPRIMARY KEY
制約も指定されています。PRIMARY KEY
デフォルトはNONCLUSTERED
。
例5–Nullable列に主キーを作成する
主キーは、NOT NULL
として定義されている列に対してのみ作成できます。 。 NULL
に設定されている列に主キーを作成しようとした場合 、エラーが発生します。
ただし、null可能性を指定しない場合、列はNOT NULL
に設定されます デフォルトで。
これを示すために、別のテーブルを作成しましょう。ただし、今回はNULL
に設定します。 :
USE PK_Test; CREATE TABLE Dogs ( DogId int IDENTITY (1,1) NULL PRIMARY KEY, DogName varchar(50) );
結果:
Msg 8147, Level 16, State 1, Line 3 Could not create IDENTITY attribute on nullable column 'DogId', table 'Dogs'. Msg 8111, Level 16, State 1, Line 3 Cannot define PRIMARY KEY constraint on nullable column in table 'Dogs'. Msg 1750, Level 16, State 0, Line 3 Could not create constraint or index. See previous errors.
予想どおり、エラーが発生します。
NULL
を削除しましょう テーブル定義から再試行してください:
USE PK_Test; CREATE TABLE Dogs ( DogId int IDENTITY (1,1) PRIMARY KEY, DogName varchar(50) );
結果:
Commands completed successfully. Total execution time: 00:00:00.015
今回はテーブルが正常に作成されました。
それを見てみましょう:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'DogId';
結果:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Dogs | DogId | 0 | 1 | +---------+----------+---------------+---------------+
is_nullable であるため、null許容ではないことがわかります。 フラグは 0 に設定されます 。
例6–複数の列の主キー
複数の列に主キーを作成することもできます。複数列の主キーは、複合主キーとも呼ばれます。複合主キーを作成するには、キーを定義するときに列をコンマで区切るだけです。
このように:
CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)
複数列の主キーを使用できる状況の例を次に示します。
CREATE TABLE Musician ( MusicianId int NOT NULL, FirstName varchar(60), LastName varchar(60), CONSTRAINT PK_Musician PRIMARY KEY (MusicianID) ); CREATE TABLE Band ( BandId int NOT NULL, BandName varchar(255), CONSTRAINT PK_Band PRIMARY KEY (BandId) ); CREATE TABLE BandMember ( MusicianId int NOT NULL, BandId int NOT NULL, CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId), CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId), CONSTRAINT FK_BandMember_Musician FOREIGN KEY (MusicianId) REFERENCES Musician(MusicianId) );
この例では、BandMember
テーブルには複数列の主キーがあります。この場合、主キーの各列は別のテーブルの主キーへの外部キーでもありますが、これは必須ではありません。
この例の詳細については、SQLServerで複合主キーを作成する方法を参照してください。
上記の複合主キーを参照する複数列の外部キーを使用してさらに一歩進んだ例については、SQLServerで複合外部キーを作成する方法も参照してください。