Slip først af med FK med sådan noget:
alter table address drop constraint address_person_id_fkey
Hvis det klager over, at der ikke er en address_person_id_fkey
begrænsning, brug derefter \d address;
i psql
for at finde ud af, hvad FK hedder.
Så burde en simpel trigger som denne gøre tricket:
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;
Og vedhæft det sådan her:
create trigger pseudo_fk_for_address_trigger before insert or update on address
for each row execute procedure pseudo_fk_for_address();
Så får du en fejl som denne, hvis du forsøger at tilføje en adresse til en person, der ikke findes i person
(inklusive de tabeller, der arver fra det):
playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR: No such person: 3
Du vil gerne tilføje en FØR SLETT-udløser til person
for at undgå dinglende referencer ville den grundlæggende struktur være stort set den samme. Du vil måske have et indeks på address.person_id
for at hjælpe med at understøtte FØR SLET-udløseren også.
Referencer: