2010-07-02 46 views
1

我有一個表,其中存儲2人之間的'鏈接'。爲了避免我在構建應用程序時出現進一步的複雜情況,我想創建一個可編輯的視圖,該視圖顯示鏈接記錄和鏈接記錄的反向副本。Postgres可編輯聯盟查看

如果Joe與Sally相關聯,則視圖應顯示與Sally和Sally相關的Joe鏈接到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

聲明:幾乎沒有關於可更新視圖的經驗。

RETURNING子句是問題 - links_data表很可能有7個colums(由您的視圖定義和ON INSERT規則所示),你正在與RETURNING *返回其內容爲剛插入行,但你的觀點有8列。檢查並同步這兩個列表。

+0

如果您明確地擴展*以覆蓋所有8個返回列,則該規則會創建正常,並且插入正常工作(在PostgreSQL 8.4.4上進行測試)。 – 2010-07-02 14:18:49

+0

感謝您的快速回復。你在現場。 RETURNING子句是問題。 – Oscar 2010-07-03 11:17:13