我試圖在PostgreSQL視圖上調用insert
或update
調用表。下面是我做的一個簡單的例子:如何通過觸發和插入過程將數據插入視圖時避免「空白」插入?
[Person] table:
id | lastname | firstname | city | age
[Person_View] table:
id | lastname | firstname | city
這裏是觸發和相關程序:
CREATE TRIGGER tg_update_person_view
INSTEAD OF INSERT OR UPDATE OR DELETE ON
Person_View FOR EACH ROW EXECUTE PROCEDURE update_person_view_table();
CREATE OR REPLACE FUNCTION update_person_view_table()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO Person (id, lastname, firstname)
VALUES(NEW.id, NEW.lastname, NEW.firstname);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
UPDATE Person
SET id=NEW.id, lastname=NEW.lastname, firstname=NEW.firstname
WHERE id=OLD.id;
RETURN NEW;
END IF;
RETURN NEW;
END;
$function$;
如果我做的:
INSERT INTO Person_View (id, city) VALUES ('3', 'Berlin')
一隻有ID的行被添加到視圖和父表中。
如何檢查過程中插入值的列是否具有在過程中定義的「映射」,並且如果沒有任何映射列,則不會繼續?
在Postgres裏9.3+你不需要規則,也不會觸動,基於單個表的視圖自動更新。 – klin
我知道,我應該說這個簡化的例子是可以自動更新的。我的真實情況是,我有基於多個表的視圖,我不希望這些空記錄發生。 – kaycee