2

我在创建插入触发器之前有一个 PostgreSQL,它基本上将插入重定向到子表中。插入记录后,我想中止请求以避免重复数据(通过不插入父表),因此我在触发器中使用 return NULL。问题是我需要返回记录,以便获取 ID。如果我返回 NULL,我会得到 NULL。

上面的问题在下面的链接中讨论: PostgreSQL trigger not return anything

答案之一是插入父表(通过不返回 null 而是返回新的)并使用 AFTER insert 触发器将其从父表中删除。但是我正在查看每秒 1000 次写入,由于删除,这可能是一个严重的性能问题。还有其他方法可以做到这一点吗?

确切地说,有一种方法可以返回插入行的 id,而无需插入父表并稍后将其删除。

4

1 回答 1

0

我写了你所指的答案。正如我已经暗示过的那样:

你也可以使用 aRULE ... INSTEAD ..来达到这个目的。

RULE

规则可能很棘手。我宁愿尽可能使用触发器。在你尝试这个之前,一定要阅读一下:

CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...)  -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...)    -- ... you want to insert column defaults
RETURNING tbl2.*

这将tbl2在避免幻行的同时返回值。但是根据以下文档CREATE RULE

在、 或视图的规则中INSERT,您可以添加一个 发出视图列的子句。如果规则分别由、或命令触发,则此子句将用于计算输出 。当规则由不带 的命令触发时,规则的 子句将被忽略。当前的实现只允许无条件规则包含;UPDATEDELETERETURNINGINSERT RETURNINGUPDATE RETURNINGDELETE RETURNINGRETURNINGRETURNINGINSTEADRETURNING

大胆强调我的。
既然你提到sub-tables了,我认为你需要条件来分发插入...

currval()/lastval()

如果您使用触发器进行操作,您可以使用/FOR EACH ROW轻松地从序列中获取适当的值。棘手的部分是从触发函数返回这些值。我只能想到写一个临时表。需要一些思考何时创建以及何时删除那个......currval()lastval()

我可能会重新考虑整个方法并将数据重定向到多个INSERT语句到实​​际的目标表......

于 2014-06-04T23:32:33.450 回答