PostgreSQL触发器没有返回任何内容
发布时间:2020-12-13 16:01:10 所属栏目:百科 来源:网络整理
导读:我在创建时有一个PostgreSQL触发器,它基本上将插入重定向到子表.一旦我插入记录,我想要中止请求以避免重复数据.我知道的唯一方法是在触发器中返回NULL.问题是我需要返回记录,以便我可以获取ID.如果我返回NULL,我得到… NULL. 任何想法我怎么能有一个触发器中
我在创建时有一个PostgreSQL触发器,它基本上将插入重定向到子表.一旦我插入记录,我想要中止请求以避免重复数据.我知道的唯一方法是在触发器中返回NULL.问题是我需要返回记录,以便我可以获取ID.如果我返回NULL,我得到… NULL.
任何想法我怎么能有一个触发器中止一个操作,同时仍然返回NULL以外的东西? 解决方法
你的问题留有解释空间.我理解它的方式,您希望INSERT命令的RETURNING子句返回序列生成的主键的值.
还有其他方法可以实现这一目标.就像使用 您也可以使用RULE … INSTEAD ..为此目的. 但是,要回答你的问题 – 事实上,如果这是你的问题:它可以通过使用两个触发器来完成.一个BEFORE,一个AFTER INSERT. 演示: CREATE TABLE x ( id serial PRIMARY KEY -- note the serial col.,name text ); CREATE TABLE y ( id integer PRIMARY KEY,name text ); CREATE OR REPLACE FUNCTION trg_x_insbef() RETURNS trigger AS $func$ BEGIN INSERT INTO y SELECT (NEW).*; -- write to other table RETURN NEW; END $func$LANGUAGE plpgsql; CREATE TRIGGER insbef BEFORE INSERT ON x FOR EACH ROW EXECUTE PROCEDURE trg_x_insbef(); CREATE OR REPLACE FUNCTION trg_x_insaft() RETURNS trigger AS $func$ BEGIN DELETE FROM x WHERE id = NEW.id; -- delete row again. RETURN NULL; END $func$LANGUAGE plpgsql; CREATE TRIGGER insaft AFTER INSERT ON x FOR EACH ROW EXECUTE PROCEDURE trg_x_insaft(); 在psql中调用: db=# INSERT INTO x (name) values('phantom') RETURNING id; id ---- 1 (1 row) INSERT 0 1 db=# SELECT * FROM x; id | name ----+------ (0 rows) db=# SELECT * FROM y; id | name ----+--------- 1 | phantom (1 row) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |