我正在尝试在视图上编写规则以从组件表中删除元组,但到目前为止只能从其中一个中删除数据.我已经使用了一段时间基本视图的postgres,但我对视图规则没有任何经验.
我写了一个愚蠢的小测试用例来弄清楚/显示我的问题.在这个例子中,每个子元组只有一个父元组(我的实际模式当然不是这样的).
组件表:
CREATE TABLE parent( id serial PRIMARY KEY,p_data integer NOT NULL UNIQUE ); CREATE TABLE child( id serial PRIMARY KEY,parent_id integer NOT NULL UNIQUE REFERENCES parent(id),c_data integer NOT NULL );
视图:
CREATE TABLE child_view( id integer,p_data integer,c_data integer ); CREATE RULE "_RETURN" AS ON SELECT TO child_view DO INSTEAD SELECT child.id,p_data,c_data FROM parent JOIN child ON (parent_id=parent.id);
问题删除规则
CREATE RULE child_delete AS ON DELETE TO child_view DO INSTEAD( DELETE FROM child WHERE id=OLD.id; DELETE FROM parent WHERE p_data=OLD.p_data; );
上述规则的目的是从组件表中删除视图中引用的元组. WHERE p_data = OLD.p_data对我来说似乎很奇怪,但我不知道如何在父表中引用所需的元组.
以下是我尝试使用上述规则时会发生的情况:
>SELECT * FROM child_view; id | p_data | c_data ----+--------+-------- 1 | 1 | 10 2 | 2 | 11 3 | 3 | 12 (3 rows) >DELETE FROM child_view WHERE id=3; DELETE 0 >SELECT * FROM child_view; id | p_data | c_data ----+--------+-------- 1 | 1 | 10 2 | 2 | 11 (2 rows)
但是查看父表,删除的第二部分不起作用(id = 3“should”已被删除):
>SELECT * FROM parent; id | p_data ----+-------- 1 | 1 2 | 2 3 | 3 (3 rows)
这是使用postgres v9.
任何帮助表示赞赏.除了postgres文档之外,还有指向任何涵盖视图规则的材料的指示(除非我明显错过了某些内容)也将受到赞赏.谢谢.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。