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