PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Utilizzare i trigger sulle tabelle ereditate per sostituire le chiavi esterne

Per prima cosa sbarazzati dell'FK con qualcosa del genere:

alter table address drop constraint address_person_id_fkey

Se si lamenta che non esiste un address_person_id_fkey vincolo quindi usa \d address; in psql per scoprire come si chiama l'FK.

Quindi un semplice trigger come questo dovrebbe fare il trucco:

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 allegalo in questo modo:

create trigger pseudo_fk_for_address_trigger before insert or update on address 
for each row execute procedure pseudo_fk_for_address();

Quindi riceverai un errore come questo se provi ad aggiungere un indirizzo per qualcuno che non esiste in person (comprese le tabelle che ne ereditano):

playpen=> insert into address (person_id, email, country, citycode, city, addressline) values (3, 'ab', 'b', 2, 'c', 'd');
ERROR:  No such person: 3

Vorresti aggiungere un attivatore PRIMA DELETE a person per evitare riferimenti penzolanti, quella struttura di base sarebbe praticamente la stessa. Potresti volere un indice su address.person_id per aiutare a supportare anche il trigger PRIMA DELETE.

Riferimenti: