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: