mysql - 如何处理从某个表中删除多个对象

标签 mysql database-design foreign-keys

我们有一个用户表,其中包含公司的所有用户。作为管理员,您有权删除用户条目。 UI 显示所有用户,每行有一个复选框以指示是否需要删除。其他表很可能与用户表有外键关系,因此会通过引发外键约束冲突来防止删除。

在这种情况下处理删除的最佳做法是什么,如果 UI 不显示复选框,如果可能有其他记录依赖于此用户,这实际上意味着在呈现此用户列表页面时您需要执行其他操作检查每行以确定是否需要启用该复选框

在这种情况下,最佳做法是什么。

最佳答案

首先,如果允许您DELETE 用户记录,我会感到很惊讶。您更有可能将它们标记为已锁定或不允许登录或其他内容。有时出于历史目的保留数据很重要。

其次,如果您确实需要删除行(在这种情况下或其他情况下),您应该阅读有关使用 ON DELETE CASCADE 或其他选项的外键。

参见 http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

当你删除父行(用户)时,你可以在依赖表的外键约束中声明你想要的行为:

  • RESTRICT,表示如果有依赖行不删除父级
  • CASCADE,表示自动和原子地删除任何相关行
  • SET NULL,意思是把子表的外键列的值改成NULL
  • SET 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/

相关文章:

php - SQL Select 使用同一表中的不同参数

ruby-on-rails - 如何在 Ruby on Rails 中构建多级层次结构?

MySQL::Edge Case::混合类型外键::可能还是做梦?

sql - 如何从多个表中删除数据?

foreign-keys - 规范化为 3NF(第三范式)时,您能否将复合键和/或外键移动到其他表

php - 从 mysql 数据库删除行时出错

php - 如何使用 PHP 和 MySQL 检索图像

php - Codeigniter- 函数总是返回 null

mysql - 网上申请的各类文件需要建立哪些表来存储?

mysql - SQL 数据库设计|管理者与团队的角色关系