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
    

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

    参照:



    1. MySQLdb-行が存在するかどうかを確認しますPython

    2. Oracleの条件付き選択ステートメント

    3. MySQLジョブを開始できませんでした

    4. C#.NETmd5とは異なるTSQLmd5ハッシュ