仅存在一个特定关系时删除行
Removing row when only a single specific relationship exists
我有一个 table person
,一个 uid
和一个 email
。我还有一个 table parent_child
存储父母关系的地方。它有 parent_uid
和 child_uid
,它们都是对 person
table.
的 uid
的必需引用
当我删除一个person
时,我想删除所有children只要:
- child没有设置邮箱。由于我在其他地方使用此字段的方式,我只是为此检查 @ 符号。
- 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
).
我有一个 table person
,一个 uid
和一个 email
。我还有一个 table parent_child
存储父母关系的地方。它有 parent_uid
和 child_uid
,它们都是对 person
table.
uid
的必需引用
当我删除一个person
时,我想删除所有children只要:
- child没有设置邮箱。由于我在其他地方使用此字段的方式,我只是为此检查 @ 符号。
- 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
).