ДО триггера + RETURNING возвращает NULL
Это один из BEFORE
триггеры, которые вставляют в правый раздел таблицы:
CREATE OR REPLACE FUNCTION public.insert_install_session()
RETURNS trigger
LANGUAGE plpgsql
AS
$body$
BEGIN
IF (NEW.created >= '2015-10-01 00:00:00' AND NEW.created < '2015-10-02 00:00:00') THEN
INSERT INTO install_session_2015_10_01 VALUES (NEW.*);
ELSIF (NEW.created >= '2015-10-02 00:00:00' AND NEW.created < '2015-10-03 00:00:00') THEN
INSERT INTO install_session_2015_10_02 VALUES (NEW.*);
ELSIF (NEW.created >= '2015-09-30 00:00:00' AND NEW.created < '2015-10-01 00:00:00') THEN
INSERT INTO install_session_2015_09_30 VALUES (NEW.*);
ELSE
RETURN NEW;
END IF;
RETURN NULL;
END;
$body$
CREATE TRIGGER trigger_insert_install_session
BEFORE INSERT ON install_session
FOR EACH ROW EXECUTE PROCEDURE insert_install_session
и у меня есть запрос, который использует RETURNING
:
INSERT INTO "install_session"
(<columns here>)
VALUES
(<values here>)
RETURNING "install_session"."id";
Как я могу сделать RETURNING
Работа? Кажется, он всегда возвращает NULL.
Это из-за RETURN NULL
в конце функции? Я не могу вернуться NEW
потому что строка будет вставлена во второй раз, нет? Вот официальные документы.
1 ответ
Это не будет работать с триггерным решением. Вы можете заставить его работать с правилами вместо триггеров IIRC, но у этого есть другие предостережения...
Тем не менее, чтобы просто получить автоматически сгенерированный идентификатор из serial
колонка, вы можете позвонить currval()
сразу после команды в том же сеансе:
SELECT currval('name_of_your_id_sequence_here'::regclass);
Или даже просто lastval()
- если соответствующие id
столбцы в разделах не наследуются (не имеют одинаковую последовательность).
SELECT lastval('name_of_your_id_sequence_here'::regclass);
Ты можешь использовать pg_get_serial_sequence()
чтобы найти название последовательности, если вы ее не знаете:
SELECT currval(pg_get_serial_sequence('install_session', 'id'));
Соответствующий ответ на dba.SE: