BEFORE Trigger + RETURNING返回NULL

时间:2015-10-02 01:38:49

标签: postgresql triggers partitioning sql-returning

这是插入右table partitionBEFORE触发器之一:

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

1 个答案:

答案 0 :(得分: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的相关答案:

相关问题