因此,我正在编写 2 个函数,一个用于删除模式的所有外部约束,另一个将像以前一样重新创建这些外部约束。
删除约束功能通过将各种“可延迟约束级别”选择到相应的临时表(例如:full_deferrable、not_deferrable、semi_deferrable 的临时表)中来确保后续重新创建约束功能的信息存在。我遇到了一个错误,虽然这不允许我创建约束,因为这个约束已经存在。因此,即使我已经通过前一个函数删除了这个外部约束,重新创建约束函数也会出错,例如:“错误:关系“avg_test”的约束“avg_test_k_school_fkey”已经存在”。
我检查了表以确保删除所有外部约束,并且当我在函数外部运行 ALTER TABLE 语句时,添加外部约束没有问题。所以我想知道从函数执行这个世界上发生了什么。我在想,也许我在控制流方面做错了,或者这些操作不可能从函数中调用。请让我知道,如果你有任何问题!
此功能用于重新创建外键。not_deferrable_constraints 是一个临时表,它包含子表、父表、约束是否延迟、主键/外键的字段以及约束的名称。
这是SQL:
CREATE OR REPLACE FUNCTION test.recreate_all_foreign_constraints(schema_name name)
RETURNS void
LANGUAGE plpgsql
AS $function$
declare
_tbl record;
add_constraint record;
begin
--Recreate not_deferrable_constraints
for _tbl in(select child_table from not_deferrable_constraints) loop
for add_constraint in(select constraint_name, fk_column, pk_column, parent_table from not_deferrable_constraints where child_table = _tbl.child_table) loop
execute 'ALTER TABLE ' ||schema_name||'.'|| _tbl.child_table || ' ADD CONSTRAINT ' || add_constraint.constraint_name || ' FOREIGN KEY ('|| add_constraint.fk_column ||') REFERENCES '|| add_constraint.parent_table ||' ('|| add_constraint.pk_column ||')';
end loop;
end loop;
end;
$function$
;
如果这行得通,那就太酷了!离我很近,我能感觉到!!谢谢你的帮助!
我认为你需要:
如果一个表有多个约束,您的代码将尝试多次重新创建每个约束。
或者只使用一个 for 循环,我认为你不需要嵌套。