Сначала избавьтесь от FK с помощью чего-то вроде этого:
alter table address drop constraint address_person_id_fkey
Если это жалуется на отсутствие ограничения address_person_id_fkey
, тогда используйте \d address;
в psql
, чтобы узнать, что такое FKназывается.
Тогда простой триггер, подобный этому, должен добиться цели:
create or replace function pseudo_fk_for_address() returns trigger as $$
begin
if not exists(select 1 from person where id = new.person_id) then
raise exception 'No such person: %', new.person_id;
end if;
return new;
end;
$$ language plpgsql;
И прикрепить его так:
create trigger pseudo_fk_for_address_trigger before insert or update on address
for each row execute procedure pseudo_fk_for_address();
Тогда вы получитеошибка, подобная этой, если вы пытаетесь добавить адрес для кого-то, чего нет в person
(включая таблицы, наследующие его):
playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR: No such person: 3
Вы хотите добавить триггер BEFORE DELETEна person
, чтобы избежать висячих ссылок, эта базовая структура была бы почти такой же.Возможно, вы захотите, чтобы индекс на address.person_id
также поддерживал триггер BEFORE DELETE.
Ссылки: