Najpierw pozbądź się FK za pomocą czegoś takiego:
alter table address drop constraint address_person_id_fkey
Jeśli to narzeka, że nie ma address_person_id_fkey
ograniczenie, a następnie użyj \d address;
w psql
aby dowiedzieć się, jak nazywa się FK.
Wtedy prosty wyzwalacz, taki jak ten, powinien załatwić sprawę:
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;
I dołącz go w ten sposób:
create trigger pseudo_fk_for_address_trigger before insert or update on address
for each row execute procedure pseudo_fk_for_address();
Wtedy otrzymasz taki błąd, jeśli spróbujesz dodać adres dla kogoś, kto nie istnieje w person
(w tym tabele, które z niego dziedziczą):
playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR: No such person: 3
Chcesz dodać wyzwalacz PRZED DELETE do person
aby uniknąć zwisających odniesień, ta podstawowa struktura byłaby prawie taka sama. Możesz potrzebować indeksu na address.person_id
aby wesprzeć również wyzwalacz PRZED USUNIĘCIEM.
Referencje: