早安stackoverflownians,
我有一个非常大的表,在两列上有重复项。意味着如果行a上的数字在第一行中的col1和col2中重复,我应该只保留第一行:
## table_1
col1 col2
1 10
1 10
1 10
1 11
1 11
1 12
2 20
2 20
2 21
2 21
# should return this tbl without duplication
col1 col2
1 10
1 11
1 12
2 20
2 21
我之前的代码帐户只针对col1,我不知道如何在两个coluns上查询:
CREATE TABLE temp LIKE db.table_1;
INSERT INTO temp SELECT * FROM table_1 WHERE 1 GROUP BY col1;
DROP TABLE table_1;
ALTER TABLE temp RENAME table_1;
所以我想到了:
CREATE TABLE temp LIKE db.table_1;
INSERT INTO temp(col1,col2)
SELECT DISTINCT col1,col2 FROM table_1;
then drop and rename..
但是我不确定它会起作用而MySQL往往会不稳定,如果需要太长时间我将不得不停止查询并且我再次崩溃服务器.. T.T
我们有200,000,000行,并且所有行至少有一个副本..
任何代码建议? :) 还..需要多长时间?几分钟或几小时?
答案 0 :(得分:0)
distinct子句是要走的路,但要在很多记录上运行需要一段时间。我要添加一个自动绑定的ID列,并且是你的PK。然后,您可以在不会超时的阶段运行重复数据删除。
祝你好运和HTH - 乔
答案 1 :(得分:0)
你已经知道了很多方法:)
你也可以尝试这个
使用INSERT IGNORE
而不是INSERT
。如果记录没有复制现有记录,MySQL会像往常一样插入它。如果记录是重复的,则IGNORE关键字告诉MySQL以静默方式丢弃它而不会产生错误。
从现有表中读取,然后使用INSERT IGNORE
在新表上写入。这样,您可以根据资源使用情况控制插入过程。
使用INSERT IGNORE并且确实存在密钥违规时,MySQL不会发出警告!!!