2

我想知道这是否可能(如果可能的话,如何去做)

根据日期字段为空或不为空对 postgres 9.1 中的表进行分区。

如此有效,我有一张桌子,它变得非常大,我在那里有一个“delete_on”日期,当项目被删除时,它们只会被标记为已删除。

这将是归档它们并保持活动表较小的理想选择。

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

活动(delete_on = NULL)

存档(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 文档中获取了上述内容)

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

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

4

1 回答 1

5

IS NULL您可以在和上进行分区IS NOT NULL

= NULL并且!= NULL两者总是导致NULL,因此它们发生冲突。你永远不会用= NULLSQL 编写,总是a IS NULLa IS DISTINCT FROM b.

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

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

于 2013-03-05T09:49:24.660 回答