web-dev-qa-db-ja.com

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

Postgres9.1に簡単なテーブル作成スクリプトがあります。存在しない場合にのみ、2属性PKのテーブルを作成するために必要です。

CREATE TABLE IF NOT EXISTS "mail_app_recipients"
(
    "id_draft" Integer NOT NULL,
    "id_person" Integer NOT NULL
) WITH (OIDS=FALSE); -- this is OK

ALTER TABLE "mail_app_recipients" ADD PRIMARY KEY IF NOT EXISTS ("id_draft","id_person");
-- this is problem since "IF NOT EXISTS" is not allowed.

この問題を解決する方法はありますか?前もって感謝します。

15
Pavel S.

CREATETABLE内にPK定義を含めないのはなぜですか。

CREATE TABLE IF NOT EXISTS mail_app_recipients
(
    id_draft Integer NOT NULL,
    id_person Integer NOT NULL,
    constraint pk_mail_app_recipients primary key (id_draft, id_person)
)
14

次のようなこともできますが、a_horse_with_no_nameが示すように、作成テーブルに含めることをお勧めします。

if NOT exists (select constraint_name from information_schema.table_constraints where table_name = 'table_name' and constraint_type = 'PRIMARY KEY') then

ALTER TABLE table_name
  ADD PRIMARY KEY (id);

end if;
10
Tom Gerken

作成する前にDROPを試すことができます(DROPにはIF EXISTS句):

ALTER TABLE mail_app_recipients DROP CONSTRAINT IF EXISTS mail_app_recipients_pkey;
ALTER TABLE mail_app_recipients ADD CONSTRAINT mail_app_recipients_pkey PRIMARY KEY ("id_draft","id_person");

これには、主キー制約に名前を付ける必要があることに注意してください-この例ではmail_app_recipients_pkey

1
Jakub Kukul