我们有一个表documents
,该表按时间划分为子表,如documents_2019_01
,documents_2019_02
。我们通过在父表BEFORE
上使用documents
触发器来插入正确的子表中,然后返回NULL
来中止管道,因此仅将其插入子表中来完成此操作(您猜对了),这使插入文档很麻烦,因为您必须重新查询创建的ID。我们已经研究过使用INSTEAD OF
触发器类型,但是它们不能应用于表,只能应用于视图。
这是触发器当前使用的函数:
CREATE OR REPLACE FUNCTION create_article_partition_and_insert() RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
DECLARE
partition_date TEXT;
partition TEXT;
resultId BIGINT;
BEGIN
partition_date := to_char(NEW.updated, 'YYYY_MM');
partition := TG_RELNAME || '_' || partition_date;
IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = partition)
THEN
RAISE NOTICE 'A partition has been created %',partition;
EXECUTE 'CREATE TABLE ' || partition || ' (LIKE ' || TG_RELNAME || ' INCLUDING ALL) INHERITS (' || TG_RELNAME ||
'); ';
END IF;
RAISE NOTICE 'Inserting into %',partition;
EXECUTE 'INSERT INTO ' || partition || ' SELECT(' || TG_RELNAME || ' ' || quote_literal(NEW) || ').* RETURNING id;'
INTO resultId;
NEW.id := resultId;
RETURN NEW;
END;
$$;
是否有更好的方法来按时间分区插入并返回子表的已插入行,而不必同时插入父表?
使用PG版本9.6.11
。
谢谢!