Primeiro, livre-se do FK com algo assim:
alter table address drop constraint address_person_id_fkey
Se isso se queixa de não haver um
address_person_id_fkey
restrição, use \d address;
em psql
para descobrir como se chama o FK. Então, um simples gatilho como este deve fazer o truque:
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;
E anexe assim:
create trigger pseudo_fk_for_address_trigger before insert or update on address
for each row execute procedure pseudo_fk_for_address();
Então você receberá um erro como este se tentar adicionar um endereço para alguém que não existe em
person
(incluindo as tabelas que herdam dele):playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR: No such person: 3
Você gostaria de adicionar um gatilho BEFORE DELETE a
person
para evitar referências pendentes, essa estrutura básica seria praticamente a mesma. Você pode querer um índice em address.person_id
para ajudar a suportar o gatilho BEFORE DELETE também. Referências: