sql >> Databasteknik >  >> RDS >> PostgreSQL

Använd triggers på ärvda tabeller för att ersätta främmande nycklar

Bli först av med FK med något sånt här:

alter table address drop constraint address_person_id_fkey

Om det klagar på att det inte finns en address_person_id_fkey begränsning använd sedan \d address; i psql för att ta reda på vad FK heter.

Då borde en enkel trigger som denna göra susen:

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;

Och bifoga den så här:

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

Då får du ett sådant här felmeddelande om du försöker lägga till en adress för någon som inte finns i person (inklusive tabellerna som ärver från 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 skulle vilja lägga till en BEFORE DELETE-utlösare till person för att undvika dinglande referenser skulle den grundläggande strukturen vara ungefär densamma. Du kanske vill ha ett index på address.person_id för att stödja utlösaren BEFORE DELETE också.

Referenser:



  1. Hämta funktioner DDL-kommando

  2. Entity Framework core - Innehåller är skiftlägeskänsligt eller skiftlägesokänsligt?

  3. OPENROWSET accepterar inte variabler för sina argument (SQL Server)

  4. Antal veckor och delveckor mellan två dagar räknat fel