web-dev-qa-db-fra.com

Clé étrangère PostgreSQL 11 sur les tables de partitionnement

Dans PostgreSQL 11 Notes de version j'ai trouvé les améliorations suivantes de la fonctionnalité de partitionnement:

  • Ajout de la prise en charge de PRIMARY KEY, FOREIGN KEY, des index et des déclencheurs sur les tables partitionnées

J'ai besoin de cette fonctionnalité et je l'ai testée.

Créer une table:

CREATE TABLE public.tbl_test
(
    uuid character varying(32) NOT null,
    registration_date timestamp without time zone NOT NULL    
)
PARTITION BY RANGE (registration_date);

Essayez de créer une clé primaire:

ALTER TABLE public.tbl_test ADD CONSTRAINT pk_test PRIMARY KEY (uuid);

J'obtiens une erreur Erreur SQL [0A000]. Si vous utilisez PK composite (uuid, registration_date), alors ça marche. Parce que PK contient une colonne de partitionnement

Conclusion: créer PK dans les tables de partitionnement fonctionne avec des restrictions (le besoin PK contient une colonne de partitionnement).

Essayez de créer une clé étrangère

CREATE TABLE public.tbl_test2
(
    uuid character varying(32) NOT null,
    test_uuid character varying(32) NOT null
);

ALTER TABLE tbl_test2
   ADD CONSTRAINT fk_test FOREIGN KEY (test_uuid)
   REFERENCES tbl_test (uuid);

J'obtiens une erreur Erreur SQL [42809]. Cela signifie que la CLÉ ÉTRANGÈRE sur les tables de partitionnement ne fonctionne pas.

Peut-être que je fais quelque chose de mal. Peut-être que quelqu'un a essayé cette fonctionnalité et sait comment cela fonctionne. Peut-être que quelqu'un connaît la solution de contournement, sauf la contrainte d'implémentation dans l'application.

6
Gleb Shadrin

Postgres 11 ne prend en charge que les clés étrangères de une table partitionnée vers une table (non partitionnée).

Auparavant, même cela n'était pas possible, et c'est de cela que parlent les notes de version.

Cette limitation est documentée dans le chapitre sur le partitionnement dans le manuel

Alors que les clés primaires sont prises en charge sur les tables partitionnées, les clés étrangères référençant les tables partitionnées ne sont pas prises en charge. (Les références de clés étrangères d'une table partitionnée à une autre table sont prises en charge.

(c'est moi qui souligne)

0