查看多个表的 PostgreSQL UPDATE

PostgreSQL UPDATE on VIEW multiple tables

我在 PostgreSQL 中有一个 VIEW,它由 2 个相似的 tables 组成。

基本上 table 都是这样的:

id | data
---+------
 1 | foo
 2 | bar
[...]

现在在 VIEW 中,我用这个命令得到它们:

CREATE RULE "_RETURN" AS ON SELECT TO myView DO INSTEAD
SELECT id, data
  FROM table1
  UNION ALL
SELECT (id + (SELECT MAX(id) FROM table1)),   
    data
  FROM table2;

结果是两个 table 的组合,用于数据集成

id | data
---+------
 1 | foo
 2 | bar
 3 | foo
 4 | bar
[...]

现在我想对该视图执行更新(以及随后的删除)。目的是将操作转发给数据集所属的 tables。

目前我有一些东西link这个:

CREATE RULE "_UPDATE0"
  AS ON UPDATE TO users 
  DO INSTEAD NOTHING;

PostgreSQL 需要无条件规则,这是“_UPDATE0”

CREATE RULE "_UPDATE1" 
  AS ON UPDATE TO users 
  WHERE NEW.id <= (SELECT MAX(table1.id) from table1) 
  DO ALSO
  (
    UPDATE table1 SET 
      data = NEW.data,
    WHERE table1.id = NEW.id
  );

CREATE RULE "_UPDATE2" 
  AS ON UPDATE TO myView
  WHERE NEW.id > (SELECT MAX(table1.id) from table1) 
  DO ALSO
  (
    UPDATE table2 SET 
      data = NEW.data,
    WHERE table2.id IN 
      (SELECT NEW.id - MAX(table1.id) from table1)
  ); 

_UPDATE1 按预期工作并将 myView.id <= 2 上的更新转发给 table 1.

_UPDATE2,好像根本就不行。

编辑:经过进一步修改,我想我可以在 _UPDATE2 中将其精确定位到我想要减去 ID 偏移量的部分,并在我的 WHERE 子句中使用它。

有什么想法或解释吗?我做错了什么?

好的,为我的_UPDATE2找到了一个可行的解决方案。

我将 NEW.id 拖出了子选择。

CREATE RULE "_UPDATE2" 
  AS ON UPDATE TO myView
  WHERE NEW.id > (SELECT MAX(table1.id) from table1) 
  DO ALSO
  (
    UPDATE table2 SET 
      data = NEW.data,
    WHERE table2.id = NEW.id - (SELECT MAX(table1.id) from table1)
  ); 

但是,我不知道为什么会这样。进一步解释表示赞赏。