我在 PostgreSQL 中有一个 VIEW,它由 2 个相似的表组成。
基本上两个表都是这样的:
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;
结果是两个表的组合,用于数据集成
id | data
---+------
1 | foo
2 | bar
3 | foo
4 | bar
[...]
现在我想对该 View 执行更新(随后也执行删除)。目的是将操作转发到数据集所属的表。
目前我有一些链接:
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
上的更新见表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)
);
但是,我不知道为什么会这样。感谢进一步的解释。
关于sql - VIEW 多个表上的 PostgreSQL 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44005446/