Първо се отървете от 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.
Препратки: