PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sử dụng trình kích hoạt trên bảng kế thừa để thay thế khóa ngoại

Trước tiên, hãy loại bỏ FK bằng một cái gì đó như thế này:

alter table address drop constraint address_person_id_fkey

Nếu điều đó phàn nàn về việc không có address_person_id_fkey ràng buộc rồi sử dụng địa chỉ \d address; trong psql để tìm hiểu FK được gọi là gì.

Sau đó, một trình kích hoạt đơn giản như thế này sẽ thực hiện thủ thuật:

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;

Và đính kèm nó như thế này:

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

Sau đó, bạn sẽ gặp lỗi như thế này nếu bạn cố gắng thêm địa chỉ cho người nào đó không tồn tại trong person (bao gồm các bảng kế thừa từ nó):

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

Bạn muốn thêm trình kích hoạt TRƯỚC KHI XÓA vào person để tránh các tham chiếu lủng lẳng, cấu trúc cơ bản đó sẽ khá giống nhau. Bạn có thể muốn một chỉ mục trên address.person_id để giúp hỗ trợ cả trình kích hoạt TRƯỚC KHI XÓA.

Tài liệu tham khảo:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tối ưu hóa truy vấn SQL với các hàm cửa sổ

  2. Xóa dòng ngắt khỏi đầu ra php json

  3. Có an toàn để sắp xếp lại các cột trong schema.rb cho Rails 4 / Postgres không?

  4. Hàm JPA low () trên tham số

  5. Trả về dưới dạng mảng các đối tượng JSON trong SQL (Postgres)