#sql #postgresql
#sql #postgresql
Вопрос:
Я хочу добавить внешний ключ, который проверяет, существует ли идентификатор записи об активности в одной из таблиц записей или personal_record. Можно ли это сделать с помощью Postgres?
CREATE TABLE record ( id BIGSERIAL PRIMARY KEY ); CREATE TABLE personal_record ( id BIGSERIAL PRIMARY KEY ); CREATE TABLE activity ( id BIGSERIAL PRIMARY KEY, record_id BIGINT NOT NULL, CONSTRAINT record_fk FOREIGN KEY (record_id) REFERENCES record (id) );
Ответ №1:
Как уже говорилось, это невозможно. Одна из возможностей-сгенерированные столбцы и ссылки, допускающие обнуление:
CREATE TABLE activity ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, private_record_id BIGINT, private_personal_record_id BIGINT, record_id BIGINT GENERATED ALWAYS AS (COLAESCE(private_record_id, private_personal_record_id)), CHECK( (private_record_id IS NOT NULL AND private_personal_record_id IS NULL) OR (private_record_id IS NULL AND private_personal_record_id IS NOT NULL) ), CONSTRAINT fk_activity_record_id FOREIGN KEY (private_record_id) REFERENCES record(id), CONSTRAINT fk_activity_record_id FOREIGN KEY (private_personal_record_id) REFERENCES personal_record(id), );
Возможно, вы также захотите изучить вопрос о наследовании.
Комментарии:
1. Спасибо! Да, я думаю, что наследование будет лучшим вариантом.