【问题标题】:ERROR: column "new" of relation xyz does not exist in postgresql Trigger错误:postgresql 触发器中不存在关系 xyz 的列“新”
【发布时间】:2018-05-06 06:59:42
【问题描述】:

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

【问题讨论】:

    标签: sql postgresql postgresql-9.5


    【解决方案1】:

    UPDATE 语句无法工作,因为表 tpl_league_tbl 没有列 new。您必须省略 new.

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

    NEW.tpl_league_code := leagueCode;
    

    然后当你RETURN NEW; 时,新行在插入之前被修改过,这就是你想要的。插入一行只是为了稍后更新它既麻烦又昂贵。

    另一件事:你应该运行

    SELECT count(*) FROM tpl_league_tbl;
    

    在触发器函数内部,因为这是一个非常昂贵的操作,需要顺序表扫描。

    如果您需要一个随机的、唯一的 leagueCode 后缀,我建议您使用序列并获取带有 nextval 的数字。那会很多便宜。

    【讨论】:

    • 感谢您的回答,但我正在使用休眠插入表格。有没有办法在休眠中实现这一点?
    • 嗯?这与 Hibernate 无关,都在数据库中。
    【解决方案2】:

    对于如此简单的任务,您不需要触发器。太矫枉过正了。只需创建一个序列并使用它而不是使用count。像这样的:

    CREATE SEQUENCE league_code START 1;
    
    INSERT INTO tpl_league_tbl (..., leagueCode)
    VALUES (..., 'LEAUGECODE' || nextval('league_code') || now()::varchar(10))
    

    【讨论】:

    • 我正在使用hibernate插入表格,有什么办法可以在hibernate中实现这一点?
    • 我没有任何使用 Hibernate 的经验,但我很确定它支持很多东西,如果不是,你可以在这里使用像这个问题这样的原始查询:stackoverflow.com/questions/3707098/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    相关资源
    最近更新 更多