未知名的PostgreSQL降约束(PostgreSQL drop constraint with

2019-06-28 07:09发布

我有一个需要砸几个制约因素,并在年底恢复它们的SQL脚本,但是约束名称是自动生成的,并且每个脚本运行时间会有所不同。

我知道如何从表名得到约束的名字,但它似乎并不可能使用降声明此信息。

select conname from pg_constraint where
   conrelid = (select oid from pg_class where relname='table name')
   and confrelid = (select oid from pg_class where relname='reference table');

alter table something drop constraint (some subquery)是一个语法错误。

我非常希望得到约束名称,并将其存储在一个变量,但它似乎并不认为Postgres的支持,我不能让它用psql工作\set

这甚至可能吗?

Answer 1:

要动态下降和重新建立一个外键约束,你可以把它包装都在一个功能或使用DO命令:

DO
$body$
DECLARE
   _con text := (
      SELECT quote_ident(conname)
      FROM   pg_constraint
      WHERE  conrelid = 'myschema.mytable'::regclass
      AND    confrelid = 'myschema.myreftable'::regclass
      LIMIT 1 -- there could be multiple fk constraints. Deal with it ...
      );

BEGIN
   EXECUTE '
      ALTER TABLE wuchtel12.bet DROP CONSTRAINT ' || _con;

   -- do stuff here

   EXECUTE '
      ALTER TABLE myschema.mytable
      ADD CONSTRAINT ' || _con || ' FOREIGN KEY (col)
      REFERENCES myschema.myreftable (col)';
END
$body$

你必须拥有使用表ALTER TABLE
否则,你可以创建一个功能与LANGUAGE plpgsql SECURITY DEFINER (使用相同的体)和

ALTER FUNCTION foo() OWNER TO postgres;

postgres在这里是超级用户-或表的所有者。
但一定要知道什么手动不得不说的安全性 。

该手册还具有更动态的命令。



文章来源: PostgreSQL drop constraint with unknown name