2015-10-02 3 views
0

Это один из BEFORE триггеров, которые вставляют в правый table partition:ПЕРЕД Trigger + RETURNING возвращает NULL

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, потому что строка будет вставлена ​​во второй раз, нет? Вот official docs.

ответ

0

Это не будет работать с решением триггера. Вы могли бы заставить его работать с правилами вместо триггеров 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:

+0

Могут ли ПРАВИЛА работать с PARTITIONS? К сожалению, я не могу изменить код, который использует RETURNING, поэтому currval() для меня не вариант. Спасибо, что указали на это. – kev

Смежные вопросы