Postgres 表分区“没有为行找到关系“parsel_part”的分区”错误?

Cap*_*pan 6 postgresql partitioning postgresql-10

我正在尝试使用 PostgreSQL 10 的新分区方法。我有一个包含 150 万行的父表。我想在这个已经填充的表上创建分区。

我创建了一个 新的主表,它与CREATE SCRIPT 中的真实主表具有相同的列;

CREATE TABLE master_part (objectid integer,poly geometry(Geometry,2321), parcel character varying(255), m_date(date)) PARTITION BY RANGE (m_date);
Run Code Online (Sandbox Code Playgroud)

然后我创建了子表,由 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');
Run Code Online (Sandbox Code Playgroud)

当我运行上面的脚本来创建子表时,出现以下错误;

错误:没有为行细节找到关系“parsel_part”的分区:失败行的分区键包含(m_date)=(2014-10-31)。SQL 状态:23514

这个错误似乎非常罕见,因为我找不到任何关于它的信息。

也许有人以前见过它?

Pat*_*zek 10

您的问题与文档中的这一点有关:

创建范围分区时,用指定的下限FROM包含边界,而指定的上限TO 是互斥边界

(强调)

所以实际上在

CREATE TABLE parsel_2014_10 PARTITION OF parsel_part 
     FOR VALUES FROM ('2014-10-01') TO ('2014-10-31');
Run Code Online (Sandbox Code Playgroud)

日期2014-10-31包含在这个分区,并在所有的分区表,因此无处(和同所有结束日期)

请参阅以下示例:https : //www.postgresql.org/docs/10/static/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE

to一个分区的值必须与下一个分区的from值相同(因为to部分是独占的,而部分from是包含的)。