错误:关系xyz的列“new”在postgresql Trigger中不存在

时间:2018-05-06 06:59:42

标签: sql postgresql postgresql-9.5

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

这是我的功能脚本

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();

2 个答案:

答案 0 :(得分:1)

UPDATE语句不起作用,因为表格tpl_league_tbl没有列new。您必须省略new.

但是您不应该在AFTER触发器中执行此操作,您应该在BEFORE触发器中执行此操作:

NEW.tpl_league_code := leagueCode;

然后当您RETURN NEW;时,新行已经插入之前被修改,这就是您想要的。插入一行只是为了在一瞬间更新它,这很麻烦且成本很高。

另一件事:你应该运行

SELECT count(*) FROM tpl_league_tbl;

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

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

答案 1 :(得分:0)

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

CREATE SEQUENCE league_code START 1;

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