Внешний ключ 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 Error [0A000]. Если использовать составной PK (uuid, registration_date), то он работает. Поскольку 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 для таблиц разделения не работает.

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


person Gleb Shadrin    schedule 21.12.2018    source источник


Ответы (2)


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

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

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

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

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

person a_horse_with_no_name    schedule 21.12.2018
comment
Можем ли мы использовать его по-старому (наследование + триггер)? - person Spike; 18.11.2019

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

Для v11 и более ранних версий вы можете использовать триггеры, как описано depesz в следующих сообщениях: part1, part2 и часть 3.

Обновление: PostgreSQL v12.0 был выпущен 3 октября 2019 г., с включенной функцией

person Mohammad Alhashash    schedule 04.05.2019
comment
Похоже, эта функция будет частью v12, см. Здесь: commitfest.postgresql.org/22/1877 < / а> - person Blama; 07.06.2019