我试图在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