ERROR: column "new" of relation xyz does not exist in postgresql Trigger

ERROR: column "new" of relation xyz does not exist in postgresql Trigger

我正在尝试在插入 tpl_league_tbl table 后使用触发器为列 tpl_league_code 生成代码。首先插入新条目,然后应该进行更新,但我收到一条错误消息,指出关系 tpl_league_tbl 的列 new 不存在。

这是我的函数脚本

CREATE OR REPLACE FUNCTION createLeagueCode()
RETURNS trigger AS
$BODY$
DECLARE
  leagueCode character varying(25);
BEGIN
  leagueCode := 'LEAUGECODE'||(SELECT COUNT(*) FROM tpl_league_tbl)||
(SELECT CAST (NOW() AS CHARACTER VARYING(10)));
  UPDATE tpl_league_tbl SET new.tpl_league_code=leagueCode;
  RETURN new;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

这是我的触发器

CREATE TRIGGER createLeagueTrigger
AFTER INSERT
ON tpl_league_tbl
FOR EACH ROW
EXECUTE PROCEDURE createLeagueCode();

UPDATE 语句无法工作,因为 table tpl_league_tbl 没有列 new。您将不得不省略 new..

但是你不应该在 AFTER 触发器中这样做,你应该在 BEFORE 触发器中这样做:

NEW.tpl_league_code := leagueCode;

然后当你RETURN NEW;时,新行在插入之前已经被修改,这就是你想要的。插入一行只是为了稍后更新它既麻烦又昂贵。

另一件事:你应该 运行

SELECT count(*) FROM tpl_league_tbl;

在触发器函数中,因为这是一个非常昂贵的操作,需要顺序 table 扫描。

如果您需要 leagueCode 的随机、唯一的后缀,我建议您使用一个序列并使用 nextval 获取数字。那将便宜很多

这么简单的任务不需要触发器。这太过分了。只需创建一个序列并使用它而不是使用 count。像这样:

CREATE SEQUENCE league_code START 1;

INSERT INTO tpl_league_tbl (..., leagueCode)
VALUES (..., 'LEAUGECODE' || nextval('league_code') || now()::varchar(10))