ALTER TABLEで既存のテーブルのプライマリーキー(主キー)を変更する

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

になります。

タイトルとURLをコピーしました