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?
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 avecTO
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 ).