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)即使数据已更改也会受到影响的行。如果我更换更新的顺序,那么会发生同样的情况,但是相反。
我该如何解决这个问题,以便它返回正确的受影响行数。
谢谢。
答
这是正确的一个很好的解释。 PostgreSQL无法通过规则知道。而且,规则很慢。你真的应该考虑一个触发器。
答
正如Section 39.6. Rules and Command Status
记录如果是查询任何无条件的INSTEAD规则,那么最初的查询将不会在所有执行。在这种情况下,服务器将返回由INSTEAD规则(有条件或无条件)插入的最后一个查询的命令状态,并且是相同命令类型(INSERT,UPDATE或DELETE)的作为原始查询。如果没有满足这些要求的查询被任何规则添加,则返回的命令状态将显示原始查询类型并为行计数和OID字段赋零。
在我来说,我能够通过公开使用视图和INSTEAD OF
触发视图上的关系来解决。