查看多个表的 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)
);
但是,我不知道为什么会这样。进一步解释表示赞赏。
我在 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)
);
但是,我不知道为什么会这样。进一步解释表示赞赏。