仅存在一个特定关系时删除行

Removing row when only a single specific relationship exists

我有一个 table person,一个 uid 和一个 email。我还有一个 table parent_child 存储父母关系的地方。它有 parent_uidchild_uid,它们都是对 person table.

uid 的必需引用

当我删除一个person时,我想删除所有children只要:

  1. child没有设置邮箱。由于我在其他地方使用此字段的方式,我只是为此检查 @ 符号。
  2. child没有其他parents。

现在我正在尝试通过 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;

没有比触发器更好的方法了。

你会索引 person(uid)parent(parent_uid)parent_child(child_uid) 以提高效率(后一个索引应该是不必要的,因为你将在 [=13 上有一个主键约束=] 和 child_uid).