簡體   English   中英

錯誤:PostgreSQL觸發器中不存在關系xyz的列“ new”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM