主キーが存在しない場合にのみ PostgreSQL テーブルに追加する

Shihab Sikder 2023年6月20日
  1. PostgreSQL の既存のテーブルに主キーを割り当てる
  2. 主キーが存在しない場合に PostgreSQL テーブルに追加する
主キーが存在しない場合にのみ PostgreSQL テーブルに追加する

場合によっては、他のテーブルとのリレーションを作成するために必要な主キーを宣言せずにテーブルを作成することがあります。 これで、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 のような制約を自動的に割り当てるため、この制約が存在するかどうかを確認する必要があります。

手順は次のとおりです。

  1. 主キーが存在する場合は削除します。
  2. 主キーを追加します。
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
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website

関連記事 - PostgreSQL Key

関連記事 - PostgreSQL Table