【问题标题】:Remove duplicates from TWO columns从两列中删除重复项
【发布时间】:2023-03-20 02:55:02
【问题描述】:

早安stackoverflownians,

我有一张非常大的桌子,两列上有重复项。意味着如果 a 行的数字在 b 行的 col1 和 col2 中重复,我应该只保留 a 行:

## 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,我不知道如何在两个列上查询:

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 行,并且所有行都至少有一个重复..

任何代码建议? :) 还有..需要多长时间?分钟还是小时?

【问题讨论】:

  • 查看本题第一个答案;它可以帮助您找到解决方案; stackoverflow.com/questions/7105618/…
  • INSERT INTO ... SELECT DISTINCT 是这样做的正确方法。如果您遇到稳定性问题,只需让您的站点/系统脱机,直到查询完成。提前计划停机时间。

标签: mysql duplicates


【解决方案1】:

你已经知道很多方法了:)

你也可以试试这个

使用INSERT IGNORE 而不是INSERT。如果一条记录不复制现有记录,MySQL 照常插入它。如果记录是重复的,IGNORE 关键字告诉 MySQL 静默丢弃它而不产生错误。

从现有表中读取,然后使用INSERT IGNORE 写入新表。这样您就可以根据您的资源使用情况控制插入过程。

当使用 INSERT IGNORE 并且您确实有键违规时,MySQL 不会发出警告!!!

【讨论】:

  • 谢谢!因此,如果我执行 INSERT IGNORE INTO temp(col1,col2) SELECT DISTINCT col1,col2 FROM table_1 ==> 是否比仅插入等更快。?
  • INSERT IGNORE INTO temp(col1,col2) SELECT DISTINCT col1,col2 FROM table_1
  • 我很想知道它是如何执行的。听起来很有希望。
  • 我还没有为此做任何基准测试,但我可以建议如果你已经这样做了,你可以试试这个。在像 cpu , io 使用这样的固定资源边界中,您也可以按照其他人的建议为不同的方式提出一些基准。我相信人们会感兴趣,这对很多人都会有帮助。
【解决方案2】:

distinct 子句是要走的路,但在这么多记录上运行需要一段时间。我会添加一个自动增量的 ID 列,并且是您的 pk。然后您可以在不会超时的阶段运行重复数据删除。

祝你好运,HTH -- 乔

【讨论】:

  • 哦,等等!我真的很想这样做:我试图在 col1 上添加 ID PK,但它显示错误,因为有重复..?我应该添加一个列 ID AUTO_INCREMENT PRIMARY KEY 吗?
  • 哦,我看错了...如果我有一个列 ID AUTO_INCREMENT PK,...那会更快吗?
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2021-02-09
  • 2015-07-20
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多