まず、次のような方法で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
person
にBEFOREDELETEトリガーを追加する必要があります 参照がぶら下がるのを避けるために、その基本的な構造はほとんど同じです。 address.person_id
にインデックスが必要な場合があります BEFOREDELETEトリガーのサポートにも役立ちます。
参照: