我有一张桌子,可存储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本身并编辑这可能是一个问题。
我知道在哪里可以使用它吗?
答案 0 :(得分:0)
免责声明:几乎没有可更新视图的经验。
您的RETURNING
子句是问题 - links_data
表最可能有7个列(如您的视图定义和ON INSERT
规则所示)并且您要返回其内容刚刚插入的RETURNING *
行,但您的视图有8列。检查并同步这两个列表。