2

それが可能かどうか(そして可能であればどうやってそれを実行するか)疑問に思っています

日付フィールドがnullまたはnullでないことに基づいて、postgres9.1でテーブルを分割します。

事実上、私はテーブルを持っていて、それはかなり大きくなり、そこに「delete_on」の日付があり、アイテムが削除されると、削除済みとしてタグ付けされます。

これは、それらをアーカイブしてアクティブなテーブルを小さく保つのに理想的です。

私はテーブルパーティションを考えていて、

アクティブ(delete_on = NULL)

アーカイブ(deleted_on!= NULL)

次に、レコードを更新し、それを削除するように設定すると、アーカイブテーブルに書き込まれます。

2つの別々のテーブルを作成し、データをコピーするコードを記述するだけで手動で実行できますが、データベースに直接配置できるのであれば、それが必要です。

何か案は?

編集:

マスターテーブル

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のドキュメントから上記を引用しました)

すでにアクティブなテーブルにあるフィールドを更新する場合、これはどのように機能しますか?

したがって、アクティブなテーブルにレコードがあり(つまり、deleteがnull)、そのレコードを削除するように設定します(日付スタンプを付けることによって)。その時点で、アーカイブテーブルに移動したいと思います。

4

1 に答える 1

5

IS NULLとに分割できますIS NOT NULL

= NULL両方とも!= NULL常に結果にNULLなるため、競合します。= NULLSQLで書くことは決してありません、常にa IS NULLまたはa IS DISTINCT FROM b

PostgreSQLのテーブル継承ベースのパーティショニングと関連する制約の除外を設定する方法の詳細については、ドキュメントを参照してください。

いずれの場合も、「データをコピーするためのコードを書く」必要はありません。最悪の場合、単純なを書く必要がありますINSERT INTO newtable SELECT * FROM oldtable WHERE somefield IS NULL;

于 2013-03-05T09:49:24.660 に答える