Postgres可编辑联盟视图

时间:2010-07-02 11:11:42

标签: postgresql view union

我有一张桌子,可存储2个人之间的“链接”。为了防止我正在构建的应用程序出现进一步的复杂情况,我想创建一个可编辑的视图,显示链接记录和链接记录的反向副本。

如果Joe与Sally相关联,则视图应显示Joe链接到Sally和Sally链接到Joe。

所以我创建了一个UNION,如下所示:

CREATE VIEW links AS

SELECT  id,
  link_origin_id AS person_id,
  link_origin_id,
  link_rcvd_id,
  link_type,
  link_summary,
  created_at,
  updated_at
 FROM links_data 

 UNION

 SELECT  id,
   link_rcvd_id,
   link_origin_id,
   link_rcvd_id,
   link_type,
   link_summary,
   created_at,
   updated_at
 FROM links_data

视图正常。请注意,该视图会创建一个附加列'person_id',该列不在基础表中。

我在创建将编辑基础表格的postgres规则时遇到了麻烦。

具体来说,我可以在不是UNION视图时成功编辑表视图。但下面是当我尝试使用UNION视图编写规则时发生的情况:

CREATE RULE inverse_links AS ON INSERT TO links DO INSTEAD
INSERT INTO links_data
  (id, link_origin_id, link_type, link_summary, link_rcvd_id, created_at, 
   updated_at)

VALUES (nextval('people_id_seq'), new.link_origin_id, new.link_type, 
        new.link_summary, new.link_rcvd_id, new.created_at, new.updated_at)

RETURNING *;

上述规则应将编辑内容重定向到基础表'links_data'。

但是我收到以下错误:

ERROR:  RETURNING list's entry 3 has different type from column "link_origin_id"

********** Error **********

ERROR: RETURNING list's entry 3 has different type from column "link_origin_id"
SQL state: 42P17

我认为可能存在的两个问题是:1)视图有一个额外的列导致列类型不匹配或2)可能存在这样一个事实:表是UNION本身并编辑这可能是一个问题。

我知道在哪里可以使用它吗?

1 个答案:

答案 0 :(得分:0)

免责声明:几乎没有可更新视图的经验。

您的RETURNING子句是问题 - links_data表最可能有7个列(如您的视图定义和ON INSERT规则所示)并且您要返回其内容刚刚插入的RETURNING *行,但您的视图有8列。检查并同步这两个列表。