首页 > 解决方案 > Postgres:DELETE 挂在具有自引用外键的表上

问题描述

我正在尝试从具有自引用外键的表中删除行:

CREATE TABLE items (
    id        SERIAL  PRIMARY KEY,
    parent_id INTEGER      NOT NULL,
    FOREIGN KEY (parent_id) REFERENCES refers(id)
);

现在当我简单地做:

DELETE FROM items;

查询永远冻结。如果我用 Ctrl-C 杀死它,它会说

错误:由于用户请求而取消语句上下文:SQL 语句“UPDATE ONLY“public”。“items”SET“parent”=NULL WHERE $1 OPERATOR(pg_catalog.=)“parent””

如何从这样的表中删除行?

标签: postgresqlforeign-keysfreezeself-reference

解决方案


根据这个答案,Postgres 中的外键被实现为触发器,因此您可以暂时禁用外键检查,如下所示:

ALTER TABLE items DISABLE TRIGGER ALL; 
DELETE FROM items; 
ALTER TABLE items ENABLE TRIGGER ALL;

推荐阅读