PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Użyj wyzwalaczy w dziedziczonych tabelach, aby zastąpić klucze obce

Najpierw pozbądź się FK za pomocą czegoś takiego:

alter table address drop constraint address_person_id_fkey

Jeśli to narzeka, że ​​nie ma address_person_id_fkey ograniczenie, a następnie użyj \d address; w psql aby dowiedzieć się, jak nazywa się FK.

Wtedy prosty wyzwalacz, taki jak ten, powinien załatwić sprawę:

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;

I dołącz go w ten sposób:

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

Wtedy otrzymasz taki błąd, jeśli spróbujesz dodać adres dla kogoś, kto nie istnieje w person (w tym tabele, które z niego dziedziczą):

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

Chcesz dodać wyzwalacz PRZED DELETE do person aby uniknąć zwisających odniesień, ta podstawowa struktura byłaby prawie taka sama. Możesz potrzebować indeksu na address.person_id aby wesprzeć również wyzwalacz PRZED USUNIĘCIEM.

Referencje:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobieraj agregaty dla dowolnych przedziałów czasu

  2. Metapolecenia w Psycopg2 - \d nie działa

  3. PostgreSQL nie akceptuje aliasów kolumn w klauzuli WHERE

  4. PostGIS, Czy możliwe jest utworzenie wielokąta z niektórych punktów

  5. Postgresql Wiele zliczeń dla jednego stołu