通常在POSTGRES中删除外键

15

一般情况下如何删除外键。我是说,如果在一个表中有许多外键约束条件,比如:

MonthlyEvaluatedBudgetTable 约束条件:

  • budgetid_pk(主键)
  • branchid_fk(外键)
  • accountid_fk(外键)
  • dept_fk(外键)

在PostgreSQL中是否有一种方法可以通常删除所有外键,而不仅仅是特定的现有表中的外键?我正在使用以下代码行来删除现有表中的一个外键。

    ALTER TABLE "public"."monthlyevaluatedbudgettable"
    DROP CONSTRAINT "accountid_fk";

但是我想在不特别输入accountid_fkbranchid_fkdept_fk的情况下删除它。有没有办法呢?谢谢。


3
为什么?无论如何。很简单。首先,你需要找到所有的外键(https://dev59.com/VXM_5IYBdhLWcg3w9oQA),然后你需要删除它们。 - pumbo
3个回答

20

像这样在 DO 语句中循环:

b=# create table a (a int primary key, b int unique);
CREATE TABLE
b=# create table b (a int references a(a), b int references a(b));
CREATE TABLE
b=# do
$$
declare r record;
begin
for r in (select constraint_name from information_schema.table_constraints where table_schema = 'public' and table_name='b') loop
  raise info '%','dropping '||r.constraint_name;
  execute CONCAT('ALTER TABLE "public"."b" DROP CONSTRAINT '||r.constraint_name);
end loop;
end;
$$
;
INFO:  dropping b_a_fkey
INFO:  dropping b_b_fkey
DO

1
请注意,您不仅删除了外键。此代码将删除所有主键约束和唯一键约束。如果您想筛选外键,可以在查询中添加constraint_type ='FOREIGN KEY'。 - Hasan Veli Soyalan

7
感谢Vao Tsun提供的解决方案,它帮助了我。
在我的情况下(Posgresql 9.6),我只需要添加一个小的“改进”: and constraint_name like 'fk_%'这个附加约束可以防止出现以下错误:

PG::SyntaxError: ERROR:  syntax error at or near "2200" LINE 1: ALTER TABLE "relationships" DROP CONSTRAINT 2200_856906_1_no...

execute <<-SQL.squish
  DO $$
  declare r record;
  begin
    for r in (
      select constraint_name
      from information_schema.table_constraints
      where table_name='relationships'
      and constraint_name like 'fk_%'
    ) loop
    raise info '%','dropping '||r.constraint_name;
    execute CONCAT('ALTER TABLE "relationships" DROP CONSTRAINT '||r.constraint_name);
    end loop;
  end;
  $$
SQL

4

仅在 @alexandar 的解决方案上进行改进。

使用 constraint_type = 'FOREIGN KEY' 替代 constraint_name like 'fk_%'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接