postgresql - 使用 PL/pgsql 触发器更新同一个表中的旧记录

标签 postgresql plpgsql

我正在尝试使用触发器函数来更新同一个表中的旧记录,并在新记录取代它们时将它们标记为冗余。

我正在尝试使用TG_TABLE_NAME作为更新导致此触发器触发的表的通用方法。我的代码如下所示:

BEGIN
  UPDATE TG_TABLE_NAME 
  SET "Redundant"=true
  WHERE "DocumentID"=NEW."DocumentID"
  AND "RecordID" = NEW."RecordID"
  AND "TransactionID" < NEW."TransactionID"
  AND "Redundant" = false ;
  RETURN NEW;
END

但是当触发器触发时,postgres 提示它找不到名为“tg_table_name”的表

我猜我正在做一些明显错误的事情,但我是 pl/PGSQL 的新手。有人对如何更新旧记录(具有匹配的 RecordID 和较小的 TransactionID)有任何建议吗?

最佳答案

您不能在纯 SQL 中使用变量作为标识符。您需要构建 SQL 语句并使用 EXECUTE。 <强> Dynamic SQL 。 可能看起来像这样:

CREATE FUNCTION foo() RETURNS trigger AS
$BODY$
BEGIN
EXECUTE '
  UPDATE ' || quote_ident(TG_RELNAME) || '
  SET    "Redundant" = true
  WHERE  "DocumentID" = $1
  AND    "RecordID" = $2
  AND    "TransactionID" < $3
  AND    "Redundant" = FALSE'
USING
   NEW."DocumentID"
  ,NEW."RecordID"
  ,NEW."TransactionID";

  RETURN NEW;
END;
$BODY$ language plpgsql;

请注意我如何使用 USING 子句传递变量。简化语法。
您可以在 related answer 中找到更多信息和手册链接。 .

关于postgresql - 使用 PL/pgsql 触发器更新同一个表中的旧记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283946/

相关文章:

postgresql - PgBouncer 和 PgPool II 的其他中间件替代品是什么?

sql - PL/PGSQL 总是返回数组或数组列表

node.js - Postgres : Complex Multiple Update query for one to many relationship

sql - 使用另一个查询的输出动态执行查询

database - 有额外约束的外键?

php - DateTime 对象上的不同 timezone_types

mysql - 连接2个表的SQL查询

postgresql - 在 plpgsgl 异常处理程序中获取违反的 fk 的名称

sql - 在自定义聚合函数中查找 SUM 和 MAX

选择字段上的 Django SearchVector