我们有一个用户表,其中包含公司的所有用户。作为管理员,您有权删除用户条目。 UI 显示所有用户,每行有一个复选框以指示是否需要删除。其他表很可能与用户表有外键关系,因此会通过引发外键约束冲突来防止删除。
在这种情况下处理删除的最佳做法是什么,如果 UI 不显示复选框,如果可能有其他记录依赖于此用户,这实际上意味着在呈现此用户列表页面时您需要执行其他操作检查每行以确定是否需要启用该复选框
在这种情况下,最佳做法是什么。
最佳答案
首先,如果允许您DELETE
用户记录,我会感到很惊讶。您更有可能将它们标记为已锁定或不允许登录或其他内容。有时出于历史目的保留数据很重要。
其次,如果您确实需要删除行(在这种情况下或其他情况下),您应该阅读有关使用 ON DELETE CASCADE
或其他选项的外键。
参见 http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
当你删除父行(用户)时,你可以在依赖表的外键约束中声明你想要的行为:
RESTRICT
,表示如果有依赖行不删除父级CASCADE
,表示自动和原子地删除任何相关行SET NULL
,意思是把子表的外键列的值改成NULLSET DEFAULT
,表示将外键列中的值更改为为该列定义的默认值
当然,这些约束只在 InnoDB 中有效。 MyISAM 不支持外键。
关于您的评论:不,没有办法快速检查是否存在引用给定用户行的相关行。这些统计数据必须逐个用户进行管理。因此它将包含有关复制相关行本身的顺序的数据。到那时,您还不如直接查询数据,而不是假设的统计数据。以下是我的做法:
SELECT u.*
FROM Users u
LEFT OUTER JOIN SomeChildTable1 c1 ON (u.user_id = c1.user_id)
LEFT OUTER JOIN SomeChildTable2 c2 ON (u.user_id = c2.user_id)
...other tables
WHERE c1.user_id IS NULL AND c2.user_id IS NULL AND ...other terms
通过使用外连接,c1、c2 等中的列在没有匹配时为 NULL,而 Users
中的列无论是否匹配都返回。因此,查询仅返回那些没有相关行的 Users
。
有些人回避联接,因为他们在某篇杂志文章中被告知联接的成本很高,但与实现您想要的目标的其他解决方案相比,联接看起来并不那么糟糕。在这种情况下,它可以利用这些外键中 user_id
列的索引,而根本不必读取行数据。
关于mysql - 如何处理从某个表中删除多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2091070/