主キーが存在しない場合にのみ PostgreSQL テーブルに追加する
Shihab Sikder
2023年6月20日
場合によっては、他のテーブルとのリレーションを作成するために必要な主キーを宣言せずにテーブルを作成することがあります。 これで、alter
クエリを使用してテーブルを更新し、主キーを更新できます。
PostgreSQL の既存のテーブルに主キーを割り当てる
リレーションシップを作成するときは、主キーが必要です。 テーブルには複数のリレーションが存在する可能性がありますが、主キーがないとリレーションを作成できません。
次のようなテーブルを作成したとします。
CREATE TABLE Product(
PRODUCT_ID INT,
PRODUCT_NAME VARCHAR,
PRODUCT_PRICE NUMERIC,
PRODUCT_DESCRIPTION VARCHAR
);
ここで、テーブルの構成とデータ型を確認したい場合は、次のようになります。
postgres=# \d Product
Table "public.product"
Column | Type | Collation | Nullable | Default
---------------------+-------------------+-----------+----------+---------
product_id | integer | | |
product_name | character varying | | |
product_price | numeric | | |
product_description | character varying | | |
では、主キーを追加しましょう。 ここでは、主キーとして product_id
を割り当てます。
方法は次のとおりです。
postgres=# ALTER TABLE Product ADD PRIMARY KEY (PRODUCT_ID);
ALTER TABLE
postgres=# \d Product\
Table "public.product"
Column | Type | Collation | Nullable | Default
---------------------+-------------------+-----------+----------+---------
product_id | integer | | not null |
product_name | character varying | | |
product_price | numeric | | |
product_description | character varying | | |
Indexes:
"product_pkey" PRIMARY KEY, btree (product_id)
postgres=#
ここでは、product_id
が主キーとして割り当てられており、null にできないことがわかります。
主キーが存在しない場合に PostgreSQL テーブルに追加する
上記の方法は、主キーがあっても主キーを追加します。 ここで、存在しない場合は主キーを確認して追加します。
ここで注意が必要です。 Postgres は、主キーを追加するたびに product_pkey
のような制約を自動的に割り当てるため、この制約が存在するかどうかを確認する必要があります。
手順は次のとおりです。
- 主キーが存在する場合は削除します。
- 主キーを追加します。
ALTER TABLE product DROP CONSTRAINT IF EXISTS product_pkey;
ALTER TABLE product ADD CONSTRAINT product_pkey PRIMARY KEY (PRODUCT_ID);
psql シェルの出力は次のとおりです。
postgres=# ALTER TABLE product DROP CONSTRAINT IF EXISTS product_pkey;
NOTICE: constraint "product_pkey" of relation "product" does not exist, skipping
ALTER TABLE
postgres=# ALTER TABLE product ADD CONSTRAINT product_pkey PRIMARY KEY (PRODUCT_ID);
ALTER TABLE
postgres=# \d Product
Table "public.product"
Column | Type | Collation | Nullable | Default
---------------------+-------------------+-----------+----------+---------
product_id | integer | | not null |
product_name | character varying | | |
product_price | numeric | | |
product_description | character varying | | |
Indexes:
"product_pkey" PRIMARY KEY, btree (product_id)
主キーと Postgres でテーブルを変更する方法の詳細については、次の ブログ にアクセスしてください。
著者: Shihab Sikder