PostgreSQL 10の新しいパーティション分割方法を使用しようとしています。150万行を含む親テーブルがあります。すでにデータが入力されているこのテーブルにパーティションを作成します。
CREATE SCRIPTからreal masterテーブルと同じ列を持つnew masterテーブルを作成しました。
CREATE TABLE master_part (objectid integer,poly geometry(Geometry,2321), parcel character varying(255), m_date(date)) PARTITION BY RANGE (m_date);
次に、m_date列で分割された子テーブルを作成しました。
CREATE TABLE parsel_2014_04
PARTITION OF parsel_part FOR VALUES FROM ('2014-04-01') TO ('2014-04-30');
CREATE TABLE parsel_2014_05
PARTITION OF parsel_part FOR VALUES FROM ('2014-05-01') TO ('2014-05-31');
CREATE TABLE parsel_2014_06
PARTITION OF parsel_part FOR VALUES FROM ('2014-06-01') TO ('2014-06-30');
CREATE TABLE parsel_2014_07
PARTITION OF parsel_part FOR VALUES FROM ('2014-07-01') TO ('2014-07-31');
CREATE TABLE parsel_2014_08
PARTITION OF parsel_part FOR VALUES FROM ('2014-08-01') TO ('2014-08-31');
CREATE TABLE parsel_2014_09
PARTITION OF parsel_part FOR VALUES FROM ('2014-09-01') TO ('2014-09-30');
CREATE TABLE parsel_2014_10
PARTITION OF parsel_part FOR VALUES FROM ('2014-10-01') TO ('2014-10-30');
CREATE TABLE parsel_2014_11
PARTITION OF parsel_part FOR VALUES FROM ('2014-11-01') TO ('2014-11-30');
CREATE TABLE parsel_2014_12
PARTITION OF parsel_part FOR VALUES FROM ('2014-12-01') TO ('2014-12-31');
CREATE TABLE parsel_2015_01
PARTITION OF parsel_part FOR VALUES FROM ('2015-01-01') TO ('2015-01-31');
CREATE TABLE parsel_2015_02
PARTITION OF parsel_part FOR VALUES FROM ('2015-02-01') TO ('2015-02-28');
CREATE TABLE parsel_2015_03
PARTITION OF parsel_part FOR VALUES FROM ('2015-03-01') TO ('2015-03-31');
CREATE TABLE parsel_2015_04
PARTITION OF parsel_part FOR VALUES FROM ('2015-04-01') TO ('2015-04-30');
上記のスクリプトを実行して子テーブルを作成すると、以下のエラーが発生します。
エラー:リレーション「parsel_part」のパーティションが行に見つかりません詳細:失敗した行のパーティションキーに(m_date)=(2014-10-31)が含まれています。 SQL状態:23514
このエラーは、何も見つからなかったため、非常にまれであるようです。
多分誰かが以前にそれを見たことがありますか?
あなたの問題はドキュメントのこの点に関連しています:
範囲パーティションを作成する場合、
FROM
で指定されたlower範囲はinclusive範囲ですが、the upper boundはTO
で指定されていますis排他的な境界。
(強調を追加)
だから実際には
CREATE TABLE parsel_2014_10 PARTITION OF parsel_part
FOR VALUES FROM ('2014-10-01') TO ('2014-10-31');
日付 2014-10-31
is notこのパーティションに含まれるため、すべてのパーティションテーブルのどこにもありません(すべての終了日で同じ)
次の例を参照してください https://www.postgresql.org/docs/10/static/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE
1つのパーティションのto
値は、次のパーティションのfrom
値と同じである必要があります(to
部分は排他的で、from
は包括的であるため)。