ОШИБКА: столбец "новый" отношения xyz не существует в postgresql Trigger - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь сгенерировать код для столбца 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();

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вам не нужен триггер для такой простой задачи. Это излишне. Просто создайте последовательность и используйте ее вместо count. Как то так:

CREATE SEQUENCE league_code START 1;

INSERT INTO tpl_league_tbl (..., leagueCode)
VALUES (..., 'LEAUGECODE' || nextval('league_code') || now()::varchar(10))
0 голосов
/ 06 мая 2018

Оператор UPDATE не может работать, потому что таблица tpl_league_tbl не имеет столбца new. Вы должны опустить new..

Но вы не должны делать это в AFTER триггере, вы должны делать это в BEFORE триггере следующим образом:

NEW.tpl_league_code := leagueCode;

Затем, когда вы RETURN NEW;, новая строка была изменена до вставки , что вам и нужно. Вставлять строку громоздко и дорого только для того, чтобы обновить ее через доли секунды.

Еще одна вещь: вы должны не запустить

SELECT count(*) FROM tpl_league_tbl;

внутри функции триггера, потому что это очень дорогая операция, требующая последовательного сканирования таблицы.

Если вам нужен случайный уникальный суффикс для leagueCode, я рекомендую вам использовать последовательность и получить число с nextval. Это будет намного дешевле.

...