【问题标题】:Can "Insert Trigger For Each Row After Each Statement" use index with the newly added values?“在每个语句之后为每一行插入触发器”可以使用带有新添加值的索引吗?
【发布时间】:2014-10-14 23:14:00
【问题描述】:

我正在使用 Postgres 9.3。 我刚刚在表中添加了一个触发器。 它是一个插入后触发器,在每条语句之后为每一行执行。 我编写了触发器函数,假设同一个表的索引包含新添加的行。 如果这不是真的,批量插入将显着减慢。 我google了一下,没找到答案。

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

这是我使用的触发器定义:

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

【问题讨论】:

  • 请告诉我们触发器定义、触发器函数和create table语句。
  • 这是一个难题。这也无关紧要。您的函数不依赖于索引的存在或该索引中的行。
  • 我已经添加了触发器定义,但是我没有看到添加表和函数以回答问题的意义。在函数中,我执行了几个查询,其中一个取决于(希望使用)同一张表的索引。
  • 我猜@a_horse_with_no_name 害怕无限递归。我也是……
  • 函数很重要,因为这是真正的处理。触发器的任何性能问题都将在 function 而不是定义 中可见

标签: postgresql triggers indexing


【解决方案1】:

AFTER 触发器FOR EACH ROW 将在表中看到该行。为此,该行必须已添加到任何索引中。所以索引已经更新了。

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

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

如果您需要修改同一个表中的其他行,这通常表明存在数据模型问题。当修改不同的行时,您应该很少(如果有的话)需要使用触发器修改表中的一行。

【讨论】:

  • 对于每个语句的 AFTER 触发器也是如此吗?我不会更改或修改表格或任何其他数据。我只是在检查它是否一致,如果没有引发异常。
  • @araqnoon 是的。语句级别相同。无法看到新行的 after 语句触发器将毫无用处。如果您不修改表,则后触发器就是您想要的。
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
相关资源
最近更新 更多