この記事では、Transact-SQLを使用してSQLServerの既存のテーブルに主キーを追加する方法について説明します。
主キーは、特定のテーブルの一意の識別子として構成された列です。
通常、テーブルを作成するときに主キー制約を作成しますが、既存のテーブルに主キーを追加することもできます。
テーブルが持つことができる主キーは1つだけであることに注意してください。したがって、テーブルに主キーがすでにある場合は、主キーを追加できません。
また、主キーは、NOT NULL
として定義されている列にのみ追加できます。 。
例1-主キー制約を追加する
この例ではテーブルを作成していますが、主キー制約を追加するのを忘れています。そこで、戻ってテーブルを変更し、主キーを設定します。
テーブルを作成します(ただし、主キーの作成を忘れる ):
USE Test; CREATE TABLE Colors ( ColorId int IDENTITY (1,1) NOT NULL, ColorName varchar(50) );
結果:
Commands completed successfully. Total execution time: 00:00:00.058
おっと–主キーを作成するのを忘れました!
問題ない!今すぐ追加できます:
ALTER TABLE Colors ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);
結果:
Commands completed successfully. Total execution time: 00:00:00.031
これにより、PRIMARY KEY
が追加されました。 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__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
データベースの主キーに応じて、結果は異なります。
また、このシステムビューは、ここで指定した列よりも多くの列を返しますが、*
を使用できることにも注意してください。 必要に応じてすべての列を返すワイルドカード。
例3–NULL値を許可する列に主キーを追加する
主キーは、NOT NULL
として定義されている列にのみ追加できます 。 null許容の列に主キーを追加しようとすると、エラーが発生します。
これを示すために、別のテーブルを作成しましょう。ただし、今回は、列をNOT NULL
として指定することも忘れます。 :
USE Test; CREATE TABLE Colors2 ( ColorId int, ColorName varchar(50) );
次のクエリを実行して、列でnullが許可されているかどうかを確認できます。
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 = 'ColorId';
結果:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 1 | 0 | +---------+----------+---------------+---------------+
以前に作成したもの(Colors
で)がわかります table)はnull許容であり、ID列です。 2つ目(Colors2
内) table)はnull可能であり、ID列ではありません。
次に、null許容列に主キー制約を追加してみましょう:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
結果:
Msg 8111, Level 16, State 1, Line 1 Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'. Msg 1750, Level 16, State 0, Line 1 Could not create constraint or index. See previous errors.
したがって、この場合、列をNOT NULL
に変更する必要があります 主キーとして定義する前に。
ALTER COLUMN
を使用できます ALTER TABLE
内 この列をNOT NULL
に設定するステートメント :
ALTER TABLE Colors2 ALTER COLUMN ColorId int NOT NULL;
もう一度列を確認しましょう:
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 = 'ColorId';
結果:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 0 | +---------+----------+---------------+---------------+
つまり、Colors2
0
に設定されました 、これはnull許容ではないことを意味します(NULL値を含めることはできません)。
また、列はではないことに注意してください ID列。これについては後で説明します。
とにかく、列がNOT NULL
として定義されたので 先に進み、主キーを追加できます:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
結果:
Commands completed successfully. Total execution time: 00:00:00.048
確認するために、このテーブルのすべての主キー制約をもう一度確認しましょう:
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__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK_Colors2_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
PK_Colors2_ColorId
と呼ばれる新しい主キー リストに追加されました。
例4–列をID列に変更する
主キーは多くの場合、ID列に適用されます。 ID列は、IDENTITY
でそのように定義されます キーワードの後に、括弧内にオプションのシードと増分値が続きます。
新しい行がテーブルに追加されると、SQLServerはID列に一意の増分値を提供します。
ID列の使用を計画している場合は、すでにそれを実行している必要があります。既存の列をID列に変更することはできません。
以前にクエリを実行したとき、Colors2.ColorId
であることがわかりました。 列はではありません ID列(is_identity
であるため、これはわかります 0
に設定されています )。これは、PK_Colors2_ColorId
を作成したことを意味します 非ID列の主キー。
テーブルをID列に変更しようとすると、次のようになります。
ALTER TABLE Colors2 ALTER COLUMN ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;
結果:
Msg 156, Level 15, State 1, Line 3 Incorrect syntax near the keyword 'IDENTITY'.
前述のように、これを克服するには、列を削除してやり直す必要があります。
列にすでにデータが含まれている場合は、追加の作業を行う必要があります。これはこの記事の範囲外ですが、上記の列を削除してID列として再作成する例を次に示します。
USE Test; DROP TABLE Colors2; CREATE TABLE Colors2 ( ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY, ColorName varchar(50) );
結果:
Commands completed successfully. Total execution time: 00:00:00.049
今回は主キー制約の名前を指定しなかったことに注意してください。この場合、システムはその名前を作成します。
列をすばやく確認します:
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 = 'ColorId';
結果:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 1 | +---------+----------+---------------+---------------+
はい、ID列になりました。
このテーブルの主キーをもう一度見てみましょう:
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__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK__Colors2__8DA7674D8F57294D | PK | 1 | 1 | +-------------------------------+--------+-------------------+-------------------+
これで、PK__Colors2__8DA7674D8F57294D
というシステム名の主キーができました。 。