Help us understand the problem. What is going on with this article?

テーブルの定義を変更する(主キー制約の変更)

ALTER TABLE~DROP CONSTRAINTとALTER TABLE~ADD CONSTRAINTを使用する

 テーブルを作成したのちに、テーブルの主キー制約を変更したいことがあると思います。そのときには、ALTER TABLE~DROP CONSTRAINT(主キー制約の削除)とALTER TABLE~ADD CONSTRAINT(主キー制約の追加)を使用します。この記事ではPostgreSQLでの主キー制約の変更方法を簡単に説明します。

実行方法

 もともとの主キー制約を削除し、そのあとに主キー制約を追加します。以下にtestテーブルの列aの主キー制約を削除し、列aとbの主キー(複合キー)の制約を追加する例を示します。

(1)テーブルの作成

 CREATE TABLEを使用してtestテーブルを作成しておきます。列aを主キーに設定しました。

postgres=# CREATE TABLE test (a int PRIMARY KEY, b int, c int);
CREATE TABLE

(2)主キー制約の削除

 ALTER TABLE~DROP CONSTRAINTを使ってtestテーブルの列aの主キー制約を削除します。
 以下のように主キー名を指定しなければいけないのですが、主キーを作成するときに自分で名前を付けていなければ、テーブル名_pkeyでOKです。もし、自分で名前を付けたが、忘れてしまった場合には(4)の方法で確認することができます。

書き方:ALTER TABLE テーブル名 DROP CONSTRAINT 主キー名;

postgres=# ALTER TABLE test DROP CONSTRAINT test_pkey;
ALTER TABLE

 列aの主キー制約は削除されていますが、NOT NULL制約は削除されていないため、削除したい場合は、ALTER TABLE~ALTER COLUMN~DROP NOT NULLを使用し、以下のように削除します。

書き方:ALTER TABLE テーブル名 ALTER COLUMN 列名 DROP NOT NULL;

postgres=# ALTER TABLE test ALTER COLUMN a DROP NOT NULL;
ALTER TABLE

(3)主キー制約の追加

ALTER TABLE~ADD CONSTRAINTを使ってtestテーブルの列aとbに主キー制約を追加します。

書き方:ALTER TABLE テーブル名 ADD CONSTRAINT 主キー名 PRIMARY KEY(列名);

postgres=# ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a, b);
ALTER TABLE

(4)主キーが変わったか確認する

 最後に列aとbが主キーになっているのかを確認します。メタコマンド\dを使用します。
実行結果の一番下に「Indexes:"test_pkey" PRIMARY KEY, btree (a, b)」と書いてあり、列aとbが主キー(test_pkey)となっていることが確認できます。

書き方:\d テーブル名

postgres=# \d test
                Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a      | integer |           | not null |
 b      | integer |           | not null |
 c      | integer |           |          |
Indexes:
    "test_pkey" PRIMARY KEY, btree (a, b)

まとめ

 基本的にはテーブルを最初に設計するときにしっかりと主キーを決めることが重要ですが、主キーを変更したいときにはALTER TABLE~DROP CONSTRAINTALTER TABLE~ADD CONSTRAINTを使用しましょう。
 ちなみに、外部キー制約の変更チェック制約の変更も似たような操作で行えます。constraintは英語で「制約」を意味します。
 読んでくださりありがとうございます!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした