Bli först av med FK med något sånt här:
alter table address drop constraint address_person_id_fkey
Om det klagar på att det inte finns en address_person_id_fkey
begränsning använd sedan \d address;
i psql
för att ta reda på vad FK heter.
Då borde en enkel trigger som denna göra susen:
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;
Och bifoga den så här:
create trigger pseudo_fk_for_address_trigger before insert or update on address
for each row execute procedure pseudo_fk_for_address();
Då får du ett sådant här felmeddelande om du försöker lägga till en adress för någon som inte finns i person
(inklusive tabellerna som ärver från 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 skulle vilja lägga till en BEFORE DELETE-utlösare till person
för att undvika dinglande referenser skulle den grundläggande strukturen vara ungefär densamma. Du kanske vill ha ett index på address.person_id
för att stödja utlösaren BEFORE DELETE också.
Referenser: