删除 mysql 中的重复记录

Remove duplicate records in mysql

我有一个名为 leads 的 table 有重复记录

Leads:
*account_id
*campaign_id

我想删除所有重复项 account_id,其中 campaign_id equal to "51"

例如,如果account_id = 1991在table中出现了两次,则删除带有campaign_id = "51"的那个,保留另一个。

您可以使用删除连接:

DELETE t1
FROM yourTable t1
INNER JOIN yourTable t2
    ON t2.account_id = t1.account_id AND
       t2.campaign_id <> 51
WHERE
    t1.campaign_id = 51;

从 table 中删除没有问题,前提是:

  1. 您使用了正确的语法。
  2. 在进行任何删除操作之前,您已经备份了 table。

但是,我建议使用不同的方法:

  1. 根据现有 table 创建一个新的 table:
CREATE TABLE mytable_new LIKE mytable;
  1. 在您不想重复的列上添加唯一约束(或PRIMARY KEY):
ALTER TABLE mytable_new ADD UNIQUE(column1,[column2]);

注意:如果要将两个(或更多)列的组合标识为唯一,请将所有列名称放在 UNIQUE() 中,并用逗号分隔。也许在你的情况下,约束是 UNIQUE(account_id, campaign_id).

  1. 将数据从原始 table 插入到新 table:
INSERT IGNORE INTO mytable_new SELECT * FROM mytable;

注意:IGNORE 将仅插入与 UNIQUE() 约束匹配的 non-duplicate 值。如果您的应用程序对 table 运行 MySQL INSERT 查询,则必须通过添加 IGNORE.

来更新查询
  1. 检查数据的一致性,当您满意后,将两个 table 重命名为:
RENAME TABLE mytable TO mytable_old;
RENAME TABLE mytable_new TO mytable;

最好的一点是,如果您觉得新的 table 有问题,您仍然可以使用原来的 table。虽然更改 table 的名称只需要不到一秒钟,但这里可能的问题是,如果您有大量数据,可能需要一段时间才能完成 INSERT IGNORE

Demo fiddle

删除 t1 从你的桌子 t1 INNER JOIN yourTable t2 在 t2.account_id = t1.account_id 和 t2.campaign_id <> 51 在哪里 t1.campaign_id = 51;