postgres表分区在null日期

The*_*Fox 2 postgresql postgresql-9.1

我想知道它是否可能(以及如果它可以如何去做)

基于日期字段为空或非空来对postgres 9.1中的表进行分区.

所以有效地,我有一个表,它变得非常大,我有一个"delete_on"日期,当项目被删除时,他们只是被标记为已删除.

这对于将它们存档并使活动表保持较小是理想的.

我在考虑一个表分区,只是有类似的东西

active(delete_on = NULL)

archive(deleted_on!= NULL)

然后当我对记录进行更新并将其设置为已删除时,它将被写入存档表.

我可以通过创建两个单独的表并编写代码来复制数据来手动完成,但是如果我可以直接将它放在数据库上,我会喜欢它.

有任何想法吗?

编辑:

主表

CREATE TABLE my_table (
    id              int not null,
    deleted         date not null,
    number1         int,
    number2         int
);
Run Code Online (Sandbox Code Playgroud)

分区

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);
Run Code Online (Sandbox Code Playgroud)

触发功能

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;
Run Code Online (Sandbox Code Playgroud)

创建触发器

CREATE TRIGGER insert_my_table_trigger
    BEFORE INSERT ON my_table
    FOR EACH ROW EXECUTE PROCEDURE my_table_insert_trigger();
Run Code Online (Sandbox Code Playgroud)

(我从Postgres文档中采取了上述内容)

如果您对已存在于活动表中的字段进行更新,这将如何工作?

所以我在活动表中有一条记录(即删除为空)然后我将该记录设置为删除(通过给它一个日期戳).那时我希望它移动到归档表.

Cra*_*ger 5

你可以分区IS NULLIS NOT NULL.

= NULL并且!= NULL两者总是导致NULL,所以他们发生冲突.你永远不会写= NULLSQL,总是a IS NULLa IS DISTINCT FROM b.

有关如何设置PostgreSQL基于表继承的分区和关联约束排除的详细信息,请参阅文档.

在任何情况下都不需要"编写代码来复制数据".在最坏的情况下,你需要写一个简单的INSERT INTO newtable SELECT * FROM oldtable WHERE somefield IS NULL;.