2017-06-11 4 views
0

私はテーブルpersonuidemailを持っています。私は親の関係を保存するテーブルparent_childも持っています。それは​​とchild_uidを持っています。どちらもpersonテーブルのuidへの必要な参照です。特定の1つの関係のみが存在する場合の行の削除

私はpersonを削除すると、私は限りすべての子を削除する:は、電子メールが設定されていない

  1. 。私はこのフィールドを他の場所でどのように使用するかによって、このために@記号をチェックしています。
  2. 子供には他の親はいません。

今私はBEFORE DELETE ON personトリガーからこれをやろうとしていますが、これを処理する最も効率的な方法ではないと感じています。

FOR child IN SELECT DISTINCT child_uid FROM parent_child WHERE parent_uid = OLD.uid 
LOOP 
    IF NOT EXISTS (
     -- Any parent that is not me. 
     SELECT 1 
     FROM parent_child 
     WHERE child_uid = child AND parent_uid <> OLD.uid 
    ) THEN 
     DELETE FROM person WHERE uid = child AND email NOT LIKE '%@%' 
    END IF; 
END LOOP; 
+0

単一の特定の関係によってはどういう意味ですか? – maSTAShuFu

+0

通常、単一の 'DELETE'がループより効率的になります –

+0

そして、あなたはどのように上記を単一の削除として書くでしょうか? – Gargoyle

答えて

0

トリガーよりも良い方法はありません。

あなたはインデックスperson(uid)parent(parent_uid)と効率のためのparent_child(child_uid)(あなたが​​とchild_uidに主キー制約を持っていますので、後者の指標の一つは、不要であるべき)でしょう。

+0

私はもっときれいだったはずです。私は間違いなくトリガでこれをやっています。しかし、私がそれを行う最も効率的な方法の上に示したコードはありますか? – Gargoyle

+0

あなたのコードに問題はありません。適切なインデックス作成のヒントが追加されました。 –

関連する問題