[英]ERROR: column “new” of relation xyz does not exist in postgresql Trigger
我試圖在插入tpl_league_tbl
表后使用觸發器為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
語句無法工作,因為表tpl_league_tbl
沒有new
列。 您將不得不省略new.
。
但是,您不應在AFTER
觸發器中執行此操作,而應在BEFORE
觸發器中執行以下操作:
NEW.tpl_league_code := leagueCode;
然后,當您RETURN NEW;
,則新行在插入之前已被修改,這就是您想要的。 只插入一行以稍后更新它是麻煩且昂貴的。
另一件事:你不應該運行
SELECT count(*) FROM tpl_league_tbl;
在觸發器函數中,因為這是一項非常昂貴的操作,需要進行順序表掃描。
如果您需要leagueCode
的隨機,唯一后綴,建議您使用一個序列,並使用nextval
獲取數字。 這會便宜很多 。
您不需要觸發即可完成如此簡單的任務。 太過分了。 只需創建一個序列並使用它即可,而不使用count
。 像這樣:
CREATE SEQUENCE league_code START 1;
INSERT INTO tpl_league_tbl (..., leagueCode)
VALUES (..., 'LEAUGECODE' || nextval('league_code') || now()::varchar(10))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.