2010-01-19 25 views
2

处理许多对象的删除我们有它包含了所有从该公司的用户一个用户表。作为管理员,您有权删除用户条目。用户界面显示所有用户每行有复选框以指示是否需要删除。其他表很可能与用户表具有外键关系,因此会通过抛出外键约束违规来防止删除。如何从某个表

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

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

+0

理论上应该有一种级联删除(FK关系的好处)的机制,您使用的是哪种数据库软件? – 2010-01-19 04:31:07

+0

我正在使用MySQL – Sam 2010-01-19 05:00:29

回答

1

首先,如果你被允许DELETE用户记录我会感到惊讶。更有可能的是,你将它们标记为锁定或不允许登录。有时为了历史目的保存数据非常重要。其次,如果您确实需要删除行(在这种情况下或其他场景中),则应该使用ON DELETE CASCADE或其他选项阅读外键。

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

当删除父行(用户),您可以在相关的表格申报的外键约束你想要的行为:

  • RESTRICT,意味着不删除父如果有依赖行
  • CASCADE,这意味着自动删除任何相关行和原子
  • ​​,这意味着更改值E在子表的外键列设置为空
  • 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等列是空当没有比赛,并在Users列返回是否有一个匹配与否。所以查询只返回那些没有依赖行的Users

有些人回避从加入,因为他们被告知在加入昂贵一些杂志上的文章,但相比其他解决方案,以完成你想要的联接不看坏的东西。在这种情况下,它可以利用这些外键中user_id列的索引,而不必根本读取行数据。

+0

是的,保留历史数据的某些用户记录很重要。我想要删除用户记录,这些记录是出于测试目的而错误创建的。 从你的建议,我想它是有道理的使用RESTRICT选项,以便父行不会被删除,如果子行存在的情况下。 但我宁愿不显示复选框选项将有依赖行,在这种情况下是正确的说“我将不得不查询每一行的依赖关系,同时构建此列表并适当地禁用它们” – Sam 2010-01-19 08:42:11

+0

棘手的部分是,如果用户条目对许多表具有依赖关系,以确定是否可以删除用户条目,则可能需要对所有这些从属表进行快速检查以找到引用,这将是一个耗时的选项。有没有更好的方法来快速执行此检查以查看是否存在依赖关系? – Sam 2010-01-19 08:44:18