Mysql关系数据库使用不同的键复制

Mysql关系数据库使用不同的键复制,mysql,foreign-keys,duplicates,Mysql,Foreign Keys,Duplicates,我试图在一个月内纠正关系数据库,但我找不到有效的解决方案 这是我的问题: 我有534m行的关系数据库,有很多foreig键(30) 我可以通过插入处理union…group by…havin count(*)=1的正常副本,但也有具有不同键的副本 示例: 表1 id | key1 | value 1 | 11 | a1 2 | 22 | a1 表2 key1 | value 11 | a2 22 | a2 Foreign key table1(k

我试图在一个月内纠正关系数据库,但我找不到有效的解决方案

这是我的问题: 我有534m行的关系数据库,有很多foreig键(30)

我可以通过插入处理union…group by…havin count(*)=1的正常副本,但也有具有不同键的副本

示例:

表1

id | key1 |  value 
1  | 11   |  a1  
2  | 22   |  a1 
表2

key1 | value 
11   |  a2  
22   |  a2 

Foreign key table1(key1) references table2(key1)
我试图找到,删除重复的,纠正父母。 我试过三种不同的方法

1:PHP脚本、数组

导出表(转储)--->数组\u唯一,查找重复项,更正父数组-->导入表

它的速度相当快,但需要80GB的内存,这在将来可能是个问题

2:PHP脚本,SQL查询

exporrt表(转储)-->查找重复项-->向父表发送查询

不需要内存,但表非常大,5个查询需要1秒,5000万个重复项需要几天、几个月、几年的时间

3:关于重复更新键:我添加了一列“DUPLICATE”来存储重复键,并将除键之外的所有列定义为唯一键,
插入。。。。在重复更新concat(重复“;”,值(键))时

但有些表有不止一个键,有时我应该将24列定义为唯一索引和内存问题


我希望我能解释我的问题。你有什么想法吗?

为什么不在列上创建一个唯一的键呢。只需使用“Ignore”关键字,它将删除重复记录。
因此您的查询将类似于:
ALTER Ignore TABLE
testdb
table1

添加唯一索引
column1
column1
ASC)

你能不能在块中执行版本1?首先对其进行排序,再次按块排序以节省内存,在文件和内存中进行合并排序。删除重复项,在块中轻松删除一次,允许出现边缘情况。然后产生一个导入。你说得对,实际上我可以通过排序数组和导入块来减少内存使用,但是php不适合垃圾收集(一些愚蠢的大文件内存泄漏),我应该试试,然后你能澄清一下这是你期望定期执行的事情,还是一次性的吗?根据您的“将来可能会有问题”评论,我假设它可能需要重复。是的,它需要重复。我应该修复父表中的键,所以我不能轻易忽略它们