关于带有BEFORE INSERT触发器的postgresql:RETURNING子句

RETURNING clause with BEFORE INSERT trigger

我正在使用表继承将表拆分为较小的表。我正在使用BEFORE INSERT触发器将新数据路由到正确的继承表中。该触发器返回NULL,因此实际的INSERT不会在父表上运行。

此副作用是缺少实际INSERT

的任何结果

INSERT INTO TABLE a VALUES (...) RETURNING a_id

触发器BEFORE INSERT将新数据定向到另一个表a_CURRENT_DATE-必要时由触发功能动态创建。触发器返回NULL,因此实际的INSERT到表a中被抑制。

原始查询没有结果,因此没有a_id(a_idSERIAL列)可用。

获得a_id值的最优雅方法是什么?


好问题。这是分区的典型问题。恐怕没有好的或优雅的解决方案,您所能做的就是引入一些解决方法:

  • 插入,然后删除-是的,远非完美,
  • 如果需要由serial类型生成的id,则可以使用currval() ...,这意味着另一个查询。

这里还有另一种方法-您可以创建视图,并对该视图使用instead of触发器。很难说这是否优雅,但对我而言,这非常接近。