Как добавить внешний ключ, который указывает на одну из 2 таблиц с помощью Postgres?

#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. Спасибо! Да, я думаю, что наследование будет лучшим вариантом.