我有一个SQL脚本需要删除几个约束并在最后恢复它们,但约束名称是自动生成的,并且每次运行脚本时都会有所不同。
我知道如何从表名中获取约束名称,但似乎无法在drop语句中使用此信息。
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
一起使用。
这甚至可能吗?
答案 0 :(得分:7)
动态掉落&重新创建外键约束,您可以将它全部包装在函数中或使用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
另外,你可create a function LANGUAGE plpgsql SECURITY DEFINER
(使用相同的身体)和
ALTER FUNCTION foo() OWNER TO postgres;
postgres
在这里是超级用户 - 或者是桌子的拥有者
但一定要知道the manual has to say about security。