web-dev-qa-db-ja.com

Postgresテーブルのパーティション化「行のリレーション「parsel_part」のパーティションが見つかりません」エラー?

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

このエラーは、何も見つからなかったため、非常にまれであるようです。

多分誰かが以前にそれを見たことがありますか?

5
Capan

あなたの問題はドキュメントのこの点に関連しています:

範囲パーティションを作成する場合、FROMで指定されたlower範囲はinclusive範囲ですが、the upper boundTOで指定されています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は包括的であるため)。

5
Patrick Mevzek