我想知道它是否可能(以及如果可能的话)
根据日期字段为空或非空来对postgres 9.1中的表进行分区。
如此有效,我有一张桌子,它变得非常大,我有一个" delete_on"在那里的日期以及当项目被删除时,它们只会被标记为已删除。
这样可以将它们归档并保持活动表小。
我在考虑一个表分区,只是有类似
的东西有效(delete_on = NULL)
archive(deleted_on!= NULL)
然后,当我对记录进行更新并将其设置为已删除时,它将被写入存档表。
我可以通过创建两个单独的表并编写代码来手动复制数据来手动完成,但如果我可以直接将它放在数据库中,我会喜欢它。
有什么想法吗?
修改
主表
CREATE TABLE my_table (
id int not null,
deleted date not null,
number1 int,
number2 int
);
分区
CREATE TABLE my_table_active (
CHECK (deleted IS NULL)
) INHERITS (my_table);
CREATE TABLE my_table_archive (
CHECK (deleted IS NOT NULL)
) INHERITS (my_table);
触发功能
CREATE OR REPLACE FUNCTION my_table_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.deleted IS NULL ) THEN
INSERT INTO my_table_active VALUES (NEW.*);
ELSE
INSERT INTO my_table_archive VALUES (NEW.*);
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
创建触发器
CREATE TRIGGER insert_my_table_trigger
BEFORE INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE my_table_insert_trigger();
(我已经从Postgres文档中采用了上述内容)
如果您对已在活动表中的字段进行更新,这将如何工作?
所以我在活动表中有一条记录(即删除为空)然后我设置要删除的记录(通过给它一个日期戳)。那时我想把它移到归档表。
答案 0 :(得分:5)
您可以在IS NULL
和IS NOT NULL
上进行分区。
= NULL
和!= NULL
都会导致NULL
,因此会发生冲突。您永远不会在SQL中编写= NULL
,始终a IS NULL
或a IS DISTINCT FROM b
。
有关如何设置PostgreSQL基于表继承的分区和关联约束排除的详细信息,请参阅the documentation。
没有必要编写代码来复制数据"在任何情况下。在最糟糕的情况下,您需要编写一个简单的INSERT INTO newtable SELECT * FROM oldtable WHERE somefield IS NULL;
。