http://www.postgresql.org/docs/8.1/interactive/ddl-partitioning.htmlのドキュメントごとにパーティション化されたテーブルのセットを設定しました
CREATE TABLE t (year, a);
CREATE TABLE t_1980 ( CHECK (year = 1980) ) INHERITS (t);
CREATE TABLE t_1981 ( CHECK (year = 1981) ) INHERITS (t);
CREATE RULE t_ins_1980 AS ON INSERT TO t WHERE (year = 1980)
DO INSTEAD INSERT INTO t_1980 VALUES (NEW.year, NEW.a);
CREATE RULE t_ins_1981 AS ON INSERT TO t WHERE (year = 1981)
DO INSTEAD INSERT INTO t_1981 VALUES (NEW.year, NEW.a);
私の理解では、t(year、a)VALUES(1980、5)に挿入すると、t_1980になり、t(year、a)VALUES(1981、3)にINSERTすると、t_1981になります。 。しかし、私の理解は間違っているようです。まず、ドキュメントから次のことを理解できません
「現在、行をマスターテーブルに挿入してはならないことを指定する簡単な方法はありません。マスターテーブルのCHECK(false)制約はすべての子テーブルに継承されるため、この目的には使用できません。1つの可能性は次のとおりです。常にエラーを発生させるONINSERTトリガーをマスターテーブルに設定します(または、上記のような一連のルールを使用する代わりに、このようなトリガーを使用してデータを適切な子テーブルにリダイレクトすることもできます)。
上記は、CHECK制約とルールを設定しているにもかかわらず、INSERTが正しいテーブルに移動するように、マスターテーブルにトリガーを作成する必要があることを意味しますか?その場合、パーティション化をサポートするデータベースのポイントは何でしょうか?自分で別々のテーブルを設定することはできますか?一連の値をマスターテーブルに挿入しましたが、それらの行は継承されたテーブルではなく、マスターテーブルに残っています。
2番目の質問。行を取得するときに、マスターテーブルから選択する必要がありますか、それとも必要に応じて個々のテーブルから選択する必要がありますか?次はどのように機能しますか?
SELECT year, a FROM t WHERE year IN (1980, 1981);
更新:自分の質問に対する答えを見つけたようです
「COPYコマンドはルールを無視することに注意してください。COPYを使用してデータを挿入する場合は、データを親ではなく正しい子テーブルにコピーする必要があります。COPYはトリガーを起動するため、パーティションを作成する場合は通常どおりに使用できます。トリガーアプローチを使用したテーブル。」
私は実際にCOPYFROMを使用してデータをロードしていたため、ルールは無視されていました。TRIGGERで試してみます。