web-dev-qa-db-fra.com

Table de partitionnement Postgres "pas de partition de la relation" parsel_part "trouvée pour la ligne" erreur?

J'essaie d'utiliser la nouvelle méthode de partitionnement de PostgreSQL 10. J'ai une table parent qui contient 1,5 million de lignes. Je veux créer un partitionnement sur cette table déjà remplie.

J'ai créé une table nouveau maître qui a des colonnes identiques avec la table vrai maître du CREATE SCRIPT;

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

Ensuite, j'ai créé des tables enfants, partitionnées par la colonne 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');

Lorsque j'exécute le script ci-dessus pour créer des tables enfants, j'obtiens l'erreur ci-dessous;

ERREUR: aucune partition de la relation "parsel_part" trouvée pour la ligne DÉTAIL: La clé de partition de la ligne défaillante contient (m_date) = (2014-10-31). État SQL: 23514

Cette erreur semble être très rare car je n'ai rien trouvé à ce sujet.

Peut-être que quelqu'un l'a déjà vu?

5
Capan

Votre problème est lié à ce point de la documentation:

Lors de la création d'une partition de plage, la borne inférieure spécifiée avec FROM est un inclus lié, tandis que la limite supérieure spécifiée avec TO est une exclusivité lié .

(pas d'italique dans l'original)

Donc en fait

CREATE TABLE parsel_2014_10 PARTITION OF parsel_part 
     FOR VALUES FROM ('2014-10-01') TO ('2014-10-31');

la date 2014-10-31 n'est pas inclus dans cette partition, et donc nulle part dans toutes vos tables de partition (et même pour toutes les dates de fin)

Voir l'exemple sur: https://www.postgresql.org/docs/10/static/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE

La valeur to d'une partition doit être la même que la valeur from de la suivante (car la partie to est exclusive et la from est inclusive ).

5
Patrick Mevzek