Postgresql Can";在每条语句后插入每一行的触发器;是否将索引与新添加的值一起使用?

Postgresql Can";在每条语句后插入每一行的触发器;是否将索引与新添加的值一起使用?,postgresql,triggers,indexing,Postgresql,Triggers,Indexing,我正在使用Postgres 9.3。 我刚刚在一张桌子上加了一个触发器。 它是一个后插入触发器,在每条语句之后为每一行执行。 我对触发器函数进行了编码,假设同一个表的索引包含新添加的行。 如果这不是真的,则批量插入将显著减慢。 我用谷歌搜索了一下,但找不到答案 总之,我的问题是在一个语句之后,索引是在Postgres 9.3中“每个语句插入触发器后”之前还是之后更新的 以下是我使用的触发器定义: CREATE TRIGGER trigger_name AFTER INSERT OR UPDATE

我正在使用Postgres 9.3。 我刚刚在一张桌子上加了一个触发器。 它是一个后插入触发器,在每条语句之后为每一行执行。 我对触发器函数进行了编码,假设同一个表的索引包含新添加的行。 如果这不是真的,则批量插入将显著减慢。 我用谷歌搜索了一下,但找不到答案

总之,我的问题是在一个语句之后,索引是在Postgres 9.3中“每个语句插入触发器后”之前还是之后更新的

以下是我使用的触发器定义:

CREATE TRIGGER trigger_name
AFTER INSERT OR UPDATE
ON table_name
FOR EACH STATEMENT
EXECUTE PROCEDURE trigger_funtion();

每行的
触发器
将在表中看到该行。要可靠地实现这一点,该行必须已经添加到任何索引中。因此,索引已经更新

但是,如果试图修改导致在
AFTER
触发器内触发
AFTER
触发器的表,这通常会导致无限循环和错误。这很少是正确的做法

通常,当您尝试这样做时,实际上需要一个
BEFORE
触发器,在保存行之前对其进行修改


如果需要修改同一表中的其他行,这通常表明存在数据模型问题。当修改不同的行时,您几乎不需要使用触发器修改表中的一行。

请向我们展示触发器定义、触发器函数和
create table
语句。这是一个很难回答的问题。这也无关紧要。您的函数不依赖于索引或该索引中的行的存在。我已经添加了触发器定义,但是我不认为添加表和函数来回答这个问题有什么意义。在这个函数中,我执行了几个查询,其中一个查询依赖于(希望使用)同一个表的索引。我也是……这个函数很重要,因为实际的处理是在这里完成的。触发器的任何性能问题都将在函数中可见,而不是在定义中。对于每个语句的AFTER触发器也是这样吗?我不会更改或修改表或任何其他数据。我只是检查它是否一致,如果没有引发异常。@araqnoon是的。语句级也是如此。无法看到新行的after语句触发器将非常无用。如果您不修改表,after触发器正是您想要的。