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))
我正在尝试在插入 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))