如何处理 mySQL 中未来孤立记录的删除

How to handle the deletion of future orphan records in mySQL

我有一个这样设计的数据库:

表格:

| Snapshot |
 * id (pk)

| Detail |
 * id (pk)
 * snapshot_id (fk_delete_cascade)
 * stat1_id (fk)
 * stat2_id (fk)
 * stat3_id (fk)
 * stat4_id (fk)

| Stats |
 * id (pk)

问题是当我删除 Snapshot 时,details 会自动删除,因为 delete cascade 但相关的 stats 不会 因为关系不是好的方向(细节知道统计数据但不是相反)。这会产生大量孤立记录。

有没有一种我没有看到的简单方法来处理这个问题,或者我真的需要做一个查询来删除孤儿 stats 之后当它们没有被 4 个字段中的任何一个使用时detail?

谢谢!

保证一致性的方法是反转引用的方向。

不是让细节有 4 个 fk 到 Stats,而是在 Stats 中创建一个引用细节的 fk。

Stats
* id (pk)
* detail_id (fk)

然后你可以让那个fk级联,删除一个Detail会自动删除所有相关的Stats。

但是如果一个统计数据可能被许多细节引用,这就不起作用了。在那种情况下,您无法通过级联约束自动删除。您必须定期清理孤儿。

DELETE s FROM Stats AS s LEFT OUTER JOIN Detail AS d
  ON s.id IN (d.stat1_id, d.stat2_id, d.stat3_id, d.stat4_id)
WHERE d.id IS NULL;

不幸的是,由于 Detail 中的多列,这无法优化。它必须执行非常昂贵的 table-扫描以尝试查找相关的详细信息行。

所以如果你能像我上面描述的那样反转 fk 引用,那就更好了。