Добавлять первичный ключ в таблицу PostgreSQL, только если он не существует - PullRequest
13 голосов
/ 28 марта 2012

У меня есть простой скрипт создания таблиц в Postgres 9.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.

Есть решение, как решить эту проблему? Заранее спасибо.

Ответы [ 3 ]

14 голосов
/ 28 марта 2012

Почему бы не включить определение PK в CREATE TABLE:

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)
)
10 голосов
/ 08 сентября 2016

Вы можете сделать что-то вроде следующего, однако лучше включить его в таблицу создания, как предлагает 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;
0 голосов
/ 20 мая 2019

Вы можете попробовать 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.

...