PostgreSQL触发器不返回任何内容

PostgreSQL触发器不返回任何内容,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我在create上有一个PostgreSQL触发器,它基本上将插入重定向到子表中。插入记录后,我希望中止请求,以避免重复数据。唯一的方法(据我所知)是在触发器中返回NULL。问题是我需要返回记录,以便获取ID。如果我返回NULL,我将获取空值 你知道如何让触发器中止操作,同时仍然返回除NULL以外的内容吗?你的问题留下了解释的余地。按照我的理解,您希望INSERT命令的RETURNING子句返回序列生成的主键的值 还有其他方法可以实现这一点。类似于使用预先从序列中获取下一个id,并插入拼写了id

我在create上有一个PostgreSQL触发器,它基本上将插入重定向到子表中。插入记录后,我希望中止请求,以避免重复数据。唯一的方法(据我所知)是在触发器中返回
NULL
。问题是我需要返回记录,以便获取ID。如果我返回
NULL
,我将获取<代码>空值


你知道如何让触发器中止操作,同时仍然返回除
NULL
以外的内容吗?

你的问题留下了解释的余地。按照我的理解,您希望
INSERT
命令的
RETURNING
子句返回序列生成的主键的值

还有其他方法可以实现这一点。类似于使用预先从序列中获取下一个
id
,并插入拼写了
id
的行。
currval()
/
lastval()
获取当前会话中某个序列/任何序列的最近获取的值。更多相关答案:

您还可以使用
规则。。。为此,请改为..

但是,要回答你的问题——如果这实际上是你的问题:可以通过使用两个触发器来完成。一个
在插入之前,一个
在插入之后。
每个定义在一个事务中触发这两个行,因此第一个表中的幻影行对任何人都不可见(触发器除外)

演示:

调用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)

所以您试图在表X上构建一个触发器,将数据插入到Y和Z中,防止任何东西插入到X中,但返回一些ID?是的,我正在将数据划分到继承的表中。因此,我不希望父表中有重复的行。我基本上希望这个过程是完全透明的。处理父表时,触发器会在幕后执行所有操作。从外面往里看没有什么变化。谢谢!这正是我想要的结果。我关心的是性能,添加一行,然后删除它。我知道这不是什么大热门,只是看起来很混乱。这是不可能做到的任何其他方式?谢谢你的帮助。我相信还有其他的方法,但那正是你所要求的。我暗示在我的回答中使用nextval()。你看到了吗?(加上链接)这就是我可能做的。
nextval()
的缺点是:再调用一次服务器。因此,这取决于更快的情况。我的示例是一个变通方法,但使用起来应该非常安全。
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)