それが可能かどうか(そして可能であればどうやってそれを実行するか)疑問に思っています
日付フィールドが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)、そのレコードを削除するように設定します(日付スタンプを付けることによって)。その時点で、アーカイブテーブルに移動したいと思います。