触发前 + 返回 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上的相关回答:
这是 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上的相关回答: