ДО триггера + 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:

Другие вопросы по тегам