gpt4 book ai didi

mysql - 有条件地从 MySQL 数据库中删除标签

转载 作者:行者123 更新时间:2023-11-29 02:00:10 29 4
gpt4 key购买 nike

我的数据库中有以下三个表:

cases
id INT
description TEXT

tags
id INT
name TEXT

case_tag
id INT
case_id INT
tag_id INT

一个个案可以有任意数量的标签,一个标签可以属于任意数量的个案。

如果一个案例被删除,我想删除 tags 表中链接到它的所有标签,前提是(且仅当)它们没有链接到任何其他案例。我将如何实现这一点?

最佳答案

假设您正在使用 InnoDB,在 casecase_tag 之间创建一个 ON DELETE CASCADE 引用操作。然后在您删除所需的 case 后,相应的 case_tag 行将自动删除,剩下的就是:

DELETE FROM tag WHERE tag_id NOT IN (SELECT tag_id FROM case_tag);

[SQL Fiddle]

如果需要,您甚至可以通过触发器执行此操作,但此方法更适合某种后台“清理”过程,因为它会清除所有多余的标签,而不仅仅是与上一个相关的标签删除了案例

另一种方法是预先选择与要删除的案例相关的标签,然后尝试仅删除它们


附带建议:

  • TEXT(BLOB 的一种形式)对于 tag.name 可能有点矫枉过正 - 请改用 VARCHAR。
  • 你可能不需要 surrogate key case_tag.id
  • 考虑在 case_tag {tag_id, case_id} 上添加索引(即与我的 SQL Fiddle 中的 PK 相反)。将 tag_id 置于索引的leading edge 对于在 tag_id 上执行 FK、选择给定标签的 case 和 DELETE 很重要多于。我们包含 case_id 以使索引更有可能 cover查询和 case_id 无论如何都会包含在索引中,因为二级索引在 clustered 中表格包括 PK 的副本。
  • 在命名表时使用单数(或者至少不要混用复数和单数)。
  • 在 PK 字段名称中使用前缀。这有点争议,但根据我的经验,增加了 ER 模型、SQL 和 DAL 的可读性。 .

关于mysql - 有条件地从 MySQL 数据库中删除标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795932/

29 4 0