PostgreSQL 12 - внешний ключ для таблиц секционирования - PullRequest
1 голос
/ 11 октября 2019

Ссылка V11 - Внешний ключ PostgreSQL 11 для таблиц секционирования

Получение аналогичной ошибки также в V12.

Ниже приведены мои тестовые таблицы, PK и FK.

CREATE TABLE prod (id bigint NOT NULL, week bigint NOT NULL) PARTITION BY RANGE (week);
CREATE TABLE prod_w1 PARTITION OF prod FOR VALUES FROM (1) TO (2);
CREATE TABLE prod_w2 PARTITION OF prod FOR VALUES FROM (2) TO (3);
CREATE TABLE prod_w3 PARTITION OF prod FOR VALUES FROM (3) TO (4);
ALTER TABLE prod ADD CONSTRAINT xpk_prod PRIMARY KEY (id, week);
CREATE TABLE cust (id bigint NOT NULL, pid bigint Not NULL, week bigint NOT NULL) PARTITION BY RANGE (week);
CREATE TABLE cust_w1 PARTITION OF cust FOR VALUES FROM (1) TO (2);
CREATE TABLE cust_w2 PARTITION OF cust FOR VALUES FROM (2) TO (3);
CREATE TABLE cust_w3 PARTITION OF cust FOR VALUES FROM (3) TO (4);
ALTER TABLE cust ADD CONSTRAINT xpk_cust PRIMARY KEY (id, pid, week);
ALTER TABLE cust ADD CONSTRAINT xfk_cust FOREIGN KEY (pid) REFERENCES prod(pid) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;

Здесь последняя команда ALTER TABLE получает ошибку:

ERROR:  cannot reference partitioned table "prod"

Можете ли вы проверить V12 или любой другой патч и помочь мне устранить эту ошибку.

1 Ответ

0 голосов
/ 11 октября 2019

Это не будет работать в PostgreSQL v11, потому что внешние ключи, ссылающиеся на секционированные таблицы, поддерживаются только начиная с v12.

Ваш последний оператор также не будет работать в PostgreSQL v12, но по другим причинам:

  • Нет столбца pid в таблице prod (опечатка).

  • Внешний ключ должен ссылаться на весь уникальный или первичный ключ вцелевая таблица, а не только один из ее столбцов.

Этот оператор будет прекрасно работать в PostgreSQL v12:

ALTER TABLE cust
   ADD CONSTRAINT xfk_cust
      FOREIGN KEY (pid, week) REFERENCES prod(id, week)
      ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
...