我试图在插入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();
答案 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))