sql >> Database >  >> RDS >> PostgreSQL

Gebruik triggers op overgenomen tabellen om externe sleutels te vervangen

Verwijder eerst de FK met zoiets als dit:

alter table address drop constraint address_person_id_fkey

Als dat klaagt over het ontbreken van een address_person_id_fkey beperking gebruik dan \d address; in psql om erachter te komen hoe de FK heet.

Dan zou een simpele trigger als deze het moeten doen:

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;

En bevestig het als volgt:

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

Dan krijg je een foutmelding als deze als je een adres probeert toe te voegen voor iemand die niet bestaat in person (inclusief de tabellen die ervan overerven):

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

U wilt een BEFORE DELETE-trigger toevoegen aan person om bungelende referenties te vermijden, zou die basisstructuur vrijwel hetzelfde zijn. Misschien wilt u een index op address.person_id om ook de BEFORE DELETE-trigger te ondersteunen.

Referenties:



  1. Wijzigen op grote tafel in RDS Oplossing voor tabel vol Fout

  2. Kan ik negeer_dup_key inschakelen voor een primaire sleutel?

  3. Hibernate 5 HQL-vertaler voor Oracle Spatial

  4. Veilige Propel-verbinding, MySQL op afstand