仅在主表不存在时才将主键添加到PostgreSQL表

Pav*_* S. 13 sql postgresql alter-table primary-key postgresql-9.1

我在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.
Run Code Online (Sandbox Code Playgroud)

任何解决方案如何解决这个问题?提前致谢.

a_h*_*ame 14

为什么不在CREATE TABLE中包含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)
)
Run Code Online (Sandbox Code Playgroud)

  • 不,"ALTER TABLE"语句没有"IF NOT EXISTS"选项. (2认同)

Tom*_*ken 10

您可以执行以下操作,但最好将其包含在create table中,如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;
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,这段代码应该在 `DO $$ BEGIN ... END $$;` 中执行,[参见](https://www.postgresql.org/docs/current/plpgsql-control-structs.html ) (2认同)

Jak*_*kul 9

您可以DROP在创建它之前尝试它(DROPIF 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");
Run Code Online (Sandbox Code Playgroud)

请注意,这要求您为主键约束命名——在本例中mail_app_recipients_pkey