sql - VIEW 多个表上的 PostgreSQL 更新

标签 sql postgresql view rule-engine

我在 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/

相关文章:

javascript - 将 Angular Controller 连接到 View 时出现问题

mysql - SQL 无法运行 UPDATE 查询,因为表被指定了两次

java - 重用结果集

sql - 如何从带参数的函数创建 View ?

sql - 将两列相乘并在新列 PostgreSQL 中显示结果

android - 在横向 View 中动态旋转按钮

java - Android查看performClick()和callOnClick()的区别

sql - 在 SQL 中连接三个表

java - 通过 ssh 运行 mysql 命令

python - Google App Engine Django App Admin 登录导致 502