Внешний ключ PostgreSQL 11 для таблиц секционирования - PullRequest
0 голосов
/ 21 декабря 2018

В 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 Error [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 Error [42809].Это означает, что FOREIGN KEY на таблицах разделения не работает.

Возможно, я что-то делаю не так.Может быть, кто-то пробовал эту функциональность и знает, как это работает.Может быть, кто-нибудь знает обходной путь, кроме реализации ограничений в приложении.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

PostgreSQL v12.0 , вероятно, будет поддерживать внешние ключи, которые ссылаются на секционированные таблицы .Но это все еще не гарантировано, поскольку v12.0 все еще находится в разработке.

Вы можете использовать триггеры, как описано depesz в этих сообщениях: part1 , part2 и part3 .

0 голосов
/ 21 декабря 2018

Postgres 11 поддерживает только внешние ключи от многораздельной таблицы до (неразделенной) таблицы.

Раньше даже это было невозможно, и в этом суть замечаний к выпуску.

Это ограничение задокументировано в главе о разбиении в руководстве

Хотя первичные ключи поддерживаются в многораздельных таблицах, внешние ключи ссылаются на многораздельные таблицы не поддерживаются.(Поддерживаются ссылки внешнего ключа из секционированной таблицы на какую-то другую таблицу.

(выделено мной)

...