ALTER TABLEで既存のテーブルのプライマリーキー(主キー)を変更する
ALTER TABLEでプライマリーキー(主キー)変更
SQLServerで既存のテーブルに設定されているプライマリーキー(主キー)を
変更します。
既存のテーブルに設定されているプライマリーキー(主キー)を変更する場合は
現在設定されているプライマリーキー(主キー)を削除してから、設定する必要が
あります。
プライマリーキー(主キー)削除
プライマリーキー(主キー)の削除は
ALTER TABLE [既存のテーブル名] DROP CONSTRAINT [削除するプライマリーキー(主キー)名]
を実行します。
プライマリーキー(主キー)作成
プライマリーキー(主キー)の作成は
ALTER TABLE [既存のテーブル名] ADD CONSTRAINT [追加するプライマリーキー(主キー)名] PRIMARY KEY( カラム名 )
で追加します。
また、[削除するプライマリーキー(主キー)名]は以下のSQLで取得することができます。
SELECT key_const.name AS constraint_name FROM sys.tables AS tbls INNER JOIN sys.key_constraints AS key_const ON tbls.object_id = key_const.parent_object_id AND key_const.type = 'PK' AND tbls.name = [変更するテーブル名]
上記の内容を実行するSQLを以下にまとめます。
------------------------------------------------------------- --使用する変数を宣言する ------------------------------------------------------------- DECLARE @table_name VARCHAR(32)= 'test_table' DECLARE @pk_name VARCHAR(32)= 'PK_test_table' ------------------------------------------------------------- --デーブルを作成する ------------------------------------------------------------- CREATE TABLE test_table ( no INT NOT NULL ,id INT NOT NULL ,name VARCHAR(20) NULL ,age SMALLINT DEFAULT 0 ) ------------------------------------------------------------- --プライマリキー(主キー)を設定する ------------------------------------------------------------- EXEC( 'ALTER TABLE test_table ADD CONSTRAINT ' + @pk_name + ' PRIMARY KEY( no )' ) ------------------------------------------------------------- --変更前のプライマリキー(主キー)の内容・・・① ------------------------------------------------------------- SELECT tbls.name AS table_name ,key_const.name AS constraint_name ,idx_cols.key_ordinal AS key_ordinal ,cols.name AS col_name FROM sys.tables AS tbls INNER JOIN sys.key_constraints AS key_const ON tbls.object_id = key_const.parent_object_id AND key_const.type = 'PK' AND tbls.name = @table_name INNER JOIN sys.index_columns AS idx_cols ON key_const.parent_object_id = idx_cols.object_id AND key_const.unique_index_id = idx_cols.index_id INNER JOIN sys.columns AS cols ON idx_cols.object_id = cols.object_id AND idx_cols.column_id = cols.column_id ORDER BY key_ordinal ------------------------------------------------------------- --プライマリキー(主キー)を変更するには一旦削除が必要 ------------------------------------------------------------- EXEC( 'ALTER TABLE test_table DROP CONSTRAINT ' + @pk_name ) ------------------------------------------------------------- --プライマリキー(主キー)を変更 ------------------------------------------------------------- EXEC( 'ALTER TABLE test_table ADD CONSTRAINT ' + @pk_name + ' PRIMARY KEY( no,id )' ) ------------------------------------------------------------- --変更後のプライマリキー(主キー)の内容・・・② ------------------------------------------------------------- SELECT tbls.name AS table_name ,key_const.name AS constraint_name ,idx_cols.key_ordinal AS key_ordinal ,cols.name AS col_name FROM sys.tables AS tbls INNER JOIN sys.key_constraints AS key_const ON tbls.object_id = key_const.parent_object_id AND key_const.type = 'PK' AND tbls.name = @table_name INNER JOIN sys.index_columns AS idx_cols ON key_const.parent_object_id = idx_cols.object_id AND key_const.unique_index_id = idx_cols.index_id INNER JOIN sys.columns AS cols ON idx_cols.object_id = cols.object_id AND idx_cols.column_id = cols.column_id ORDER BY key_ordinal ------------------------------------------------------------- --デーブルを削除する ------------------------------------------------------------- DROP TABLE test_table
①の実行結果
table_name | constraint_name | key_ordinal | col_name |
---|---|---|---|
test_table | PK_test_table | 1 | no |
②の実行結果
table_name | constraint_name | key_ordinal | col_name |
---|---|---|---|
test_table | PK_test_table | 1 | no |
test_table | PK_test_table | 2 | id |
になります。