Вы можете создать три внешних ключа, допускающих значение NULL, по одному для каждой внешней таблицы. Затем используйте ограничение CHECK
, чтобы гарантировать, что только одно значение не является нулевым в любой момент времени.
Например:
create table rich_people (
rich_person_id int primary key not null,
musician_id int references musicians (musician_id),
programmer_id int references programmers (programmer_id),
cop_id int references cops (cop_id),
check (musician_id is not null and programmer_id is null and cop_id is null
or musician_id is null and programmer_id is not null and cop_id is null
or musician_id is null and programmer_id is null and cop_id is not null)
);
Таким образом, ссылочная целостность будет обеспечиваться всегда. Для удаления потребуется каскадное удаление или другая стратегия для сохранения целостности данных.