sql >> Databáze >  >> RDS >> PostgreSQL

K nahrazení cizích klíčů použijte spouštěče na zděděných tabulkách

Nejprve se zbavte FK něčím takovým:

alter table address drop constraint address_person_id_fkey

Pokud si stěžuje, že neexistuje address_person_id_fkey omezení pak použijte \d address; v psql zjistit, jak se FK jmenuje.

Pak by měl stačit jednoduchý spouštěč, jako je tento:

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;

A připojte jej takto:

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

Pokud se pokusíte přidat adresu pro někoho, kdo v person neexistuje, zobrazí se vám podobná chyba (včetně tabulek, které z něj dědí):

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

K person byste chtěli přidat spouštěč BEFORE DELETE Abychom se vyhnuli visícím odkazům, základní struktura by byla v podstatě stejná. Možná budete chtít index na address.person_id abyste také podpořili spouštěč BEFORE DELETE.

Reference:



  1. získání tří záznamů v sestupném pořadí každé kategorie pomocí codeigniter

  2. Chyba migrace Django:Sloupec neexistuje

  3. Problém návrhu tabulky databáze

  4. Jednoduchý Express program pro dotazování na výsledek