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

Brug triggere på nedarvede tabeller til at erstatte fremmednøgler

Slip først af med FK med sådan noget:

alter table address drop constraint address_person_id_fkey

Hvis det klager over, at der ikke er en address_person_id_fkey begrænsning, brug derefter \d address; i psql for at finde ud af, hvad FK hedder.

Så burde en simpel trigger som denne gøre tricket:

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;

Og vedhæft det sådan her:

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

Så får du en fejl som denne, hvis du forsøger at tilføje en adresse til en person, der ikke findes i person (inklusive de tabeller, der arver fra 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 vil gerne tilføje en FØR SLETT-udløser til person for at undgå dinglende referencer ville den grundlæggende struktur være stort set den samme. Du vil måske have et indeks på address.person_id for at hjælpe med at understøtte FØR SLET-udløseren også.

Referencer:



  1. Hvad er problemet med at slette en række fra databasen?

  2. Referencer Oracle brugerdefinerede typer over DBLINK?

  3. Få lignende længde- og breddegrad fra databasen

  4. Tilslutning til Mysql ved hjælp af Slick 3.0 - Intet brugernavn, ingen adgangskode og falsk driver er ikke lig med fejl