Postgres更新规则返回受影响的行数

问题描述:

我有一个视图表,它是两个单独的表(称为表_A和表_B)的联合。Postgres更新规则返回受影响的行数

我需要能够更新视图表中的一行,并且似乎通过“查看规则”来执行此操作的方式。视图表中的所有条目都有单独的ID,因此表_A中存在的表_A中的ID不会存在于表_B中。

我创建了以下规则:

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)即使数据已更改也会受到影响的行。如果我更换更新的顺序,那么会发生同样的情况,但是相反。

我该如何解决这个问题,以便它返回正确的受影响行数。

谢谢。

你不能。除非您在存储过程中执行此操作,并返回受影响的行数。

官方doc

这是正确的一个很好的解释。 PostgreSQL无法通过规则知道。而且,规则很慢。你真的应该考虑一个触发器。

正如Section 39.6. Rules and Command Status

记录如果是查询任何无条件的INSTEAD规则,那么最初的查询将不会在所有执行。在这种情况下,服务器将返回由INSTEAD规则(有条件或无条件)插入的最后一个查询的命令状态,并且是相同命令类型(INSERT,UPDATE或DELETE)的作为原始查询。如果没有满足这些要求的查询被任何规则添加,则返回的命令状态将显示原始查询类型并为行计数和OID字段赋零。

在我来说,我能够通过公开使用视图和INSTEAD OF触发视图上的关系来解决。