加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL触发器没有返回任何内容

发布时间:2020-12-13 16:01:10 所属栏目:百科 来源:网络整理
导读:我在创建时有一个PostgreSQL触发器,它基本上将插入重定向到子表.一旦我插入记录,我想要中止请求以避免重复数据.我知道的唯一方法是在触发器中返回NULL.问题是我需要返回记录,以便我可以获取ID.如果我返回NULL,我得到… NULL. 任何想法我怎么能有一个触发器中
我在创建时有一个PostgreSQL触发器,它基本上将插入重定向到子表.一旦我插入记录,我想要中止请求以避免重复数据.我知道的唯一方法是在触发器中返回NULL.问题是我需要返回记录,以便我可以获取ID.如果我返回NULL,我得到… NULL.

任何想法我怎么能有一个触发器中止一个操作,同时仍然返回NULL以外的东西?

解决方法

你的问题留有解释空间.我理解它的方式,您希望INSERT命令的RETURNING子句返回序列生成的主键的值.

还有其他方法可以实现这一目标.就像使用nextval()预先从序列中获取下一个id并插入id拼出的行一样.
OR currval()/ lastval()获取当前会话中序列/任何序列的最近获得的值.更多相关答案:
PostgreSQL next value of the sequences?

您也可以使用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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读