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 |
になります。
