删除连接表的重复记录并修复相关表上的外键

Posted

技术标签:

【中文标题】删除连接表的重复记录并修复相关表上的外键【英文标题】:Delete duplicate records with joined table and fix foreign keys on related table 【发布时间】:2014-10-09 20:06:56 【问题描述】:

我们有这些桌子: 用户 地址 -> 用户拥有 address_Id 帖子 -> 帖子有 user_id

问题是 Users 表有许多重复的完全相同的记录,所有字段都相等,而且在某些情况下地址相同,因此我们加入了 Users 和 Addresses 表来比较每个字段 然后用其中一个重复行更新帖子表中的外键。 然后从用户中删除所有重复项。 我们使用了一个 sql 解决方案,类似于 http://weblogs.sqlteam.com/jeffs/archive/2004/10/07/2190.aspx 但要长一点。

我的问题是如何使用 linq 和实体框架工作来完成相同的任务? 在 sql 中搜索这个问题时,我发现很多人在谈论它,但找不到关于使用 linq 或实体框架做的事情,所以如果有人之前遇到过这个问题或者有一个起点,那就太好了。

【问题讨论】:

【参考方案1】:
var ListUsers = from user in context.Users
            join address in context.Addresses
            select new
            
                User = user,
                Address = address
             into users
            group users by new 
            
                user.Property1OtherthanID,
                user.Property2OtherthanID,
                ...
                address.Property1OtherthanID,
                address.Property2OtherthanID,
                ...
             into distinct
            select new
            
                FirstUserID = distinct.FirstOrDefault().User.ID,
                UserIDs = distinct.Select(u => u.User.ID)
            

这将为您提供所有 UserIDs 的列表,其中包含相同的记录和地址,FirstUserID 作为 Key。

如果Posts 包含该外键,则可以检查ListUsers 中的每个UserID,如果是,则将其替换为ListUsersItem.FirstUserID

要从用户中删除所有重复项,请对 Users 执行相同操作,如果它与 UserIDs 匹配并且不是 FirstUserID 则删除它。或者您可以使用Distinct() 方法和使用另一种方法作为比较器来比较所有属性,然后再区分它们。

【讨论】:

以上是关于删除连接表的重复记录并修复相关表上的外键的主要内容,如果未能解决你的问题,请参考以下文章

mysql设置外键

不在数据库中的表上的外键,使用 ORM

删除左表上的重复项,同时在右表SELECT JOIN上保留重复项

很菜的数据库问题,主键的值允许重复吗?外键啥作用?

MySql 外键约束 CASCADESET NULLRESTRICTNO ACTION

请问SQL server 中的主键和外键的作用