Я пытался сослаться на секционированную таблицу в postgresql v12, но возникла проблема. Таблицы разделены на range
в столбце даты, и значения для каждого раздела представляют собой разделители месяцев (например: FOR VALUES FROM ('2020-04-01T00: 00: 00') TO ('2020-05-01T00: 00:00 '))
У меня есть 2 таблицы:
Table A
Column | Type | Collation | Nullable | Default
-----------------+--------------------------+-----------+----------+---------
uuid | character varying(36) | | not null |
start_date | timestamp with time zone | | not null |
Partition key: RANGE (start_date)
Indexes:
"table_a_pkey" PRIMARY KEY, btree (uuid, start_date)
Table B
Column | Type | Collation | Nullable | Default
-----------------+--------------------------+-----------+----------+---------
uuid | character varying(36) | | not null |
start_date | timestamp with time zone | | not null |
ref_a_id | character varying(36) | | not null |
Partition key: RANGE (start_date)
Indexes:
"table_b_pkey" PRIMARY KEY, btree (uuid, start_date)
При добавлении первичного ключа в таблицу разделов я знаю, что ключ раздела должен быть включен. Однако table_a.start_date
и table_b.start_date
не совсем совпадают, только месяц обеих дат должен совпадать в целом и, конечно же, от ref_a_id
до uuid
.
Пока что это что я пробовал:
ALTER TABLE table_a ADD CONSTRAINT ref_fk FOREIGN KEY (ref_a_id) REFERENCES table_b (uuid) DEFERRABLE INITIALLY DEFERRED;
-> ERROR: there is no unique constraint matching given keys for referenced table "table_b"
ALTER TABLE table_a ADD CONSTRAINT ref_fk FOREIGN KEY (ref_a_id) REFERENCES table_b DEFERRABLE INITIALLY DEFERRED;
-> ERROR: number of referencing and referenced columns for foreign key disagree
ALTER TABLE table_a ADD CONSTRAINT ref_fk FOREIGN KEY (ref_a_id, start_date) REFERENCES table_b (uuid, start_date) DEFERRABLE INITIALLY DEFERRED;
Последний работает, но во время импорта я получил
-> ERROR: insert or update on table "table_b" violates foreign key constraint "ref_fk"
DETAIL: Key (ref_a_id, start_date)=(XXXXX-XXXXX-XXXXX-XXXXX, 2020-05-27 01:32:13+00) is not present in table "table_a".
Единственное решение, которое я вижу прямо сейчас, - это добавить новый столбец year_month
с значения вроде 2020_04
и выполнить разбиение на list
в этом новом столбце. Поэтому ссылка должна совпадать.
Есть другое решение? Можно ли указать только месяц из столбцов start_date
вместо добавления нового столбца? Или даже может быть ссылка только на table_a.uuid
?