这是插入右table partition的BEFORE
触发器之一:
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 :(得分: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的相关答案: