我有一个视图表,它是两个独立表的联合(比如表_A和表_B)。
我需要能够更新视图表中的一行,而这似乎是通过“查看规则”来实现的。视图表中的所有条目都有单独的id,因此表_A中不存在表_A中存在的id。
我创建了以下规则:
CREATE OR REPLACE RULE view_update AS
ON UPDATE TO viewtable DO INSTEAD ( UPDATE _A SET foo = false
WHERE old.id = _A.id;
UPDATE _B SET foo = false
WHERE old.id = _B.id;
);
如果我对表_B进行更新,则返回正确的受影响行数(1)。但是,如果我更新表_A,即使数据已更改,它也会返回(0)受影响的行。如果我换掉更新的顺序,那么同样的事情就会发生,但反之亦然。
如何解决此问题,以便返回受影响的正确行数。
感谢。
答案 0 :(得分:1)
你做不到。除非您在存储过程中执行此操作并返回受影响的行数。
官方doc
中的一个很好的解释答案 1 :(得分:0)
这是正确的。 PostgreSQL没有办法通过规则知道。此外,规则很慢。你真的应该考虑一个触发器。
答案 2 :(得分:0)
如Section 39.6. Rules and Command Status
中所述如果查询有任何无条件的INSTEAD规则,则根本不会执行原始查询。在这种情况下,服务器将返回由INSTEAD规则(条件或无条件)插入的最后一个查询的命令状态,并且是相同的命令类型(INSERT ,更新或删除)作为原始查询。如果任何规则都未添加满足这些要求的查询,则返回的命令状态将显示原始查询类型,并显示行计数和OID字段的零。
在我的情况下,我能够通过在视图上使用视图和INSTEAD OF
触发器公开关系来解决问题。