2012-09-10 37 views
4

我试图纠正一个月的关系数据库,但我找不到有效的解决方案。Mysql关系数据库与不同的密钥重复

Hier是我的问题: 我有534 M行关联Db与许多外键(30)。

我可以使用union ... group来处理正常的重复... havin count(*)= 1通过插入,但也有不同键的duplciates。

例如:

表1

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

表2

key1 | value 
11 | a2 
22 | a2 

Foreign key table1(key1) references table2(key1) 

我试图找到,删除重复,纠正家长。 我已经尝试了3点不同的方式,

1:PHP脚本,阵列

导出表(转储) - > array_unique,查找重复,纠正家长阵列 - >导入表

它非常快,但需要80GB内存,这可能是问题在未来

2:PHP脚本,SQL查询

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

不需要内存,但表格非常大,5个查询需要1秒钟,50 M个副本需要几天,几个月,几年

3:ON DUPLICATE UPDATE KEY:我添加一个列 '重复' 来存储重复的键和予定义的所有列,除了密钥作为唯一的密钥,
插入....上的重复更新的concat(重复,” ;”,VALUES(键))。

但有些表已经超过1个键,有时我应该定义24列作为唯一索引和存储问题再次

我希望我可以解释我的问题。你有什么主意吗 ?

+0

难道你不能在版块1的块?首先对它进行排序,以节省内存,对文件和内存进行合并排序。轻松删除重复项,方便一次,允许边缘情况。然后生成一个导入。 – Orbling

+0

你说得对,其实我可以通过排序数组和导入块来减少内存使用量,但是php并不是很好的垃圾回收机制(一些大文件存在一些愚蠢的内存泄漏),我应该尝试一下,thanx – ekicion

+0

你能澄清一下这是不是你希望定期演出,还是一次性演出?我假设你的“未来可能会有问题”,可能需要重复。 – almcnicoll

回答

0

为什么不简单地在列上创建唯一键。只需使用“忽略”关键字,它将删除重复的记录。
因此,您的查询将如下所示:
ALTER IGNORE TABLE testdbtable1 ADD UNIQUE INDEX column1column1 ASC);

+0

我应该修复父表中的键,所以我不能轻易忽略它们 – ekicion