触发前 + 返回 returns NULL

BEFORE Trigger + RETURNING returns NULL

这是 BEFORE 触发器之一,插入右侧 table partition:

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 正常工作?它似乎总是 returns NULL。

是不是因为函数末尾的RETURN NULL?我不能 return NEW 因为该行会被第二次插入,不是吗?这是 official docs.

这不适用于触发解决方案。您可以使其与规则一起使用而不是触发器 IIRC,但这还有其他注意事项...

但是,要在同一会话中的命令后立即从 serial column, you can call currval() 获取自动生成的 ID:

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上的相关回答: