PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използвайте тригери на наследени таблици, за да замените външни ключове

Първо се отървете от FK с нещо подобно:

alter table address drop constraint address_person_id_fkey

Ако това се оплаква, че няма address_person_id_fkey ограничение след това използвайте \d address; в psql за да разберете как се нарича FK.

Тогава прост тригер като този трябва да свърши работа:

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;

И го прикачете така:

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

След това ще получите грешка като тази, ако се опитате да добавите адрес за някого, който не съществува в person (включително таблиците, които го наследяват):

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

Бихте искали да добавите тригер BEFORE DELETE към person за да се избегнат висящи препратки, тази основна структура ще бъде почти същата. Може да искате индекс на address.person_id за да подпомогне поддръжката и на тригера BEFORE DELETE.

Препратки:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql последователното сканиране забавя производителността на 500 милиона реда

  2. Как мога да променя съществуващата колона като идентичност в PostgreSQL 11.1

  3. Преобразуване на текст във Varchar

  4. Създаване на низ от масив

  5. Защо rails 5 добавя метод nextval във файла на схемата?