我怎么知道SQL数据库中的记录是否正在其他地方使用?

时间:2009-11-03 18:13:00

标签: sql sql-server sql-server-2008 foreign-keys

有没有办法知道数据库中的另一条记录正在使用某条记录?

使用delete作为示例:当我创建一个试图删除dbo.group中的组的SQL语句时,我收到此错误:

  

DELETE语句与REFERENCE约束“FK_MyTable”冲突。冲突发生在数据库“MyDB”,表“dbo.User”,列“Group_ID”。

由于我的用户与该组具有外键关系,因此我无法删除该组。我希望能够在运行delete语句之前知道记录是否链接到其他记录。有没有办法做到这一点?

基本上我想向用户显示他们正在查看的记录是不可删除的。我不想尝试删除记录。

3 个答案:

答案 0 :(得分:1)

其他人建议检测依赖行的方法,但问题是存在竞争条件:如果您的测试没有找到依赖行,并且您尝试删除该组,则可能有另一个客户端应用程序添加了在两个查询之间的短暂时间内依赖行。因此,您获取该组后未使用的信息可能会过时。

更好的方法是尝试删除该组,并处理引发的任何错误。

这对性能也有好处,因为您不必运行任何SELECT查询来检查相关行是否存在。


重新评论并编辑问题:好的,公平地说,使用此信息向用户提供提示是有意义的(例如,显示“删除组”按钮或灰显按钮)。

在这种情况下,您可以使用其他人的建议之一,例如查询Users表中相关行的计数。如果您需要多个群组的信息,我会执行一个查询,将Groups加入Users,然后按群组ID进行分组。

SELECT g.groupid, COUNT(*) AS user_count
FROM dbo.Groups g JOIN dbo.Users u ON (g.groupid = u.groupid)
GROUP BY g.groupid;

这比为每个组运行单独的SQL查询以获取用户数更好。

如果您不知道有多少表可能依赖于Groups,您应该学会使用INFORMATION_SCHEMA系统视图来查询元数据。我不认为这是你的情况,所以我不会详细说明。

答案 1 :(得分:0)

执行一个查询,检查是否有用户将列group_id设置为您要删除的ID。如果查询返回0行,则可以毫无例外地删除

SELECT count(group_id) 
FROM dbo.User
WHERE group_id = [yourgroupidtodeletevalue]

答案 2 :(得分:0)

  1. 您可以设置级联删除。

  2. 您可以查询Forign Key表。该错误告诉您哪个表依赖于外键查找。