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_id是SERIAL列)可用。
获得a_id值的最优雅方法是什么?
- 我将使用RULES进行分区。除非您进行一些处理,否则我仍然会坚持使用规则,并在规则查询中添加具有逻辑的函数
好问题。这是分区的典型问题。恐怕没有好的或优雅的解决方案,您所能做的就是引入一些解决方法:
-
插入,然后删除-是的,远非完美,
-
如果需要由serial类型生成的id,则可以使用currval() ...,这意味着另一个查询。
这里还有另一种方法-您可以创建视图,并对该视图使用instead of触发器。很难说这是否优雅,但对我而言,这非常接近。
- INSTEAD OF解决方案对我来说足够优雅
-
使用视图确实是一个聪明的主意。
-
对于某些人来说,添加视图只是在引入复杂性。以典型的IT解决方案的工作方式-只需添加另一个抽象层即可。对我来说,这解决了我的问题,但还有其他问题。通过提供视图,您以后可以更改表的结构,因为客户端没有紧密地耦合到它们。