2015-10-02 114 views
0

这是BEFORE触发器插入到右table partition之一:BEFORE触发+ 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列中获取自动生成的ID,你可以在命令后立即调用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