2016-02-29 45 views
0

在一個PostgreSQL 9.5.1數據庫,我有一個表:ON UPDATE規則jsonb

CREATE TABLE test.table01 ( pgid serial NOT NULL, sample_id text NOT NULL, all_data jsonb NOT NULL, CONSTRAINT table01_pkey PRIMARY KEY (pgid) )

而且該表的視圖:

CREATE OR REPLACE VIEW test.test_view AS SELECT table01.sample_id, table01.all_data ->> 'technician'::text AS technician, table01.all_data ->> 'depth'::text AS depth, table01.all_data ->> 'colour'::text AS colour, table01.all_data ->> 'duplicate of'::text AS dupe_of FROM test.table01;

最後,在該視圖,我創建了一個規則,旨在正確修改底層jsonb對象的視圖更新:

CREATE OR REPLACE RULE upd_test_view AS ON UPDATE TO test.test_view WHERE new.colour <> old.colour DO INSTEAD UPDATE test.table01 SET all_data = jsonb_set(table01.all_data, '{colour}'::text[], (('"'::text || new.colour) || '"'::text)::jsonb);

當我隨後簽發

UPDATE test.test_view SET colour = 'Purple' WHERE sample_id = '1234567';

我回來

ERROR: no relation entry for relid 2 ********** Error ********** ERROR: no relation entry for relid 2 SQL state: XX000

我必須做一些錯誤的,但我不能完全得到我的頭周圍。非常感謝您的專業知識。謝謝。

+0

我不熟悉json函數,但是你的問題可能就是'sample_id'字段沒有被定義爲原始表中的唯一鍵。你可以使用'pgid'嗎?或者,如果'sample_id'是唯一的,請爲其添加密鑰。 – OscarJ

+1

你不需要在'UPDATE test.table01'的某個地方設置'WHERE' SET all_data = jsonb_set(table01.all_data,'{color}':: text [],((''':: text || new。 color)||'「':: text):: jsonb);'? – OcuS

+0

吞,是的,絕對。 – Joebocop

回答

0

我不是這方面的專家,但我遇到了同樣的錯誤信息,在我的情況下,我可以通過刪除規則的WHERE部分來解決此問題。這會使規則觸發更頻繁,但它爲我解決了這個問題。看看它是否適用於你,如果這仍然相關。

相關問題