sql - PostgreSQL 删除失败,继承表上有 ON DELETE 规则

标签 sql postgresql inheritance rules

在我的 PostgreSQL 9.1 数据库中,我定义了规则,只要删除父表行,就会从子表中删除行。这一切都工作正常,直到我引入了继承。如果父(引用)表 INHERITS 来自另一个表并且我从基表中删除,则 DELETE 成功,但 RULE 似乎根本没有触发 - 引用的行未被删除。如果我尝试从派生表中删除,则会出现错误:

update or delete on table "referenced" violates foreign key constraint "fk_derived_referenced" on table "derived"

父表中没有其他行会违反外键:它正被被删除的行引用!我该如何解决这个问题?

以下脚本重现了该问题:

-- Schema

CREATE TABLE base
(
  id serial NOT NULL,
  name character varying(100),
  CONSTRAINT pk_base PRIMARY KEY (id)
);

CREATE TABLE referenced
(
  id serial NOT NULL,
  value character varying(100),
  CONSTRAINT pk_referenced PRIMARY KEY (id)
);

CREATE TABLE derived
(
  referenced_id integer,
  CONSTRAINT pk_derived PRIMARY KEY (id),
  CONSTRAINT fk_derived_referenced FOREIGN KEY (referenced_id) REFERENCES referenced (id)
)
INHERITS (base);

-- The rule

CREATE OR REPLACE RULE rl_derived_delete_referenced
AS ON DELETE TO derived DO ALSO
DELETE FROM referenced r WHERE r.id = old.referenced_id;

-- Some test data

INSERT INTO referenced (id, value)
VALUES (1, 'referenced 1');

INSERT INTO derived (id, name, referenced_id)
VALUES (2, 'derived 2', 1);

-- Delete from base - deletes the "base" and "derived" rows, but not "referenced"
--DELETE FROM base
--WHERE id = 2;

-- Delete from derived - fails with:
-- update or delete on table "referenced" violates foreign key constraint "fk_derived_referenced" on table "derived"
DELETE FROM derived
WHERE id = 2

最佳答案

正如我在评论中所说,这似乎是一种不寻常的做事方式。但是您可以让它与延迟约束一起工作。

CREATE TABLE derived
(
  referenced_id integer,
  CONSTRAINT pk_derived PRIMARY KEY (id),
  CONSTRAINT fk_derived_referenced FOREIGN KEY (referenced_id) 
    REFERENCES referenced (id) DEFERRABLE INITIALLY DEFERRED
)
INHERITS (base);

PostgreSQL 文档,Rules vs. Triggers , 说

Many things that can be done using triggers can also be implemented using the PostgreSQL rule system. One of the things that cannot be implemented by rules are some kinds of constraints, especially foreign keys.

但我不清楚您遇到的是不是这个特定限制。

关于sql - PostgreSQL 删除失败,继承表上有 ON DELETE 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7580055/

相关文章:

postgresql - 子查询结果中的模式匹配

mysql - rails : From local MySQL to Heroku

javascript - javascript中继承的标准函数

sql - 使用嵌套 JSON 数组上的过滤器进行选择

sql - 上个月的最后一天 - BigQuery

sql - 按日期条件分组

mysql - SQL Join 2 tables with "ON"on max value in second table

postgresql - 如何使用嵌套配置docker/pgadmin

c++ - 如何覆盖另一个基类中的函数?

oop - 可以采用哪些方法来使用组合而不是继承?