web-dev-qa-db-ja.com

パーティションテーブルのPostgreSQL 11外部キー

PostgreSQL 11の場合 リリースノート パーティショニング機能に次の改善点が見つかりました。

  • パーティションテーブルのPRIMARY KEY、FOREIGN KEY、インデックス、およびトリガーのサポートを追加する

この機能が必要で、テストしました。

テーブルを作成します:

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

主キーを作成してみてください:

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

SQLエラー[0A000]が発生します。コンポジットPK(uuid、registration_date)を使用する場合は、それで問題ありません。 PKにはパーティション列が含まれているため

結論:パーティションテーブルでのPKの作成は制限付きで機能します(PKにはパーティション列が必要です)。

外部キーを作成してみてください

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);

エラーSQLエラー[42809]が発生します。これは、パーティションテーブルのFOREIGN KEYが機能しないことを意味します。

たぶん私は何か間違ったことをしています。多分誰かがこの機能を試して、これがどのように機能するかを知っています。たぶん誰かがアプリケーションに制約を実装する以外の回避策を知っています。

6
Gleb Shadrin

Postgres 11は、パーティションテーブルから(非パーティション)テーブルへの外部キーfromのみをサポートします。

以前はそれさえ不可能でしたが、それがリリースノートの目的です。

この制限は、マニュアルの パーティショニングに関する章 に記載されています。

主キーはパーティション化されたテーブルでサポートされていますが、パーティション化されたテーブルを参照する外部キーはサポートされていません。 (パーティションテーブルから他のテーブルへの外部キー参照がサポートされています。

(強調鉱山)