PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Utiliser des déclencheurs sur des tables héritées pour remplacer les clés étrangères

Débarrassez-vous d'abord du FK avec quelque chose comme ceci :

alter table address drop constraint address_person_id_fkey

Si cela se plaint qu'il n'y a pas de address_person_id_fkey contrainte puis utilisez \d address; dans psql pour savoir comment s'appelle le FK.

Ensuite, un simple déclencheur comme celui-ci devrait faire l'affaire :

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;

Et joignez-le comme ceci :

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

Ensuite, vous obtiendrez une erreur comme celle-ci si vous essayez d'ajouter une adresse pour quelqu'un qui n'existe pas dans person (y compris les tables qui en héritent) :

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

Vous voudriez ajouter un déclencheur BEFORE DELETE à person pour éviter les références pendantes, cette structure de base serait à peu près la même. Vous voudrez peut-être un index sur address.person_id pour aider également à prendre en charge le déclencheur BEFORE DELETE.

Références :