删除 MySQL 数据库中的重复行


Deleting Duplicate Rows in a MySQL Database

我有以下数据库

my_table [id,name,address,phone]有很多条目,我想删除重复的数据,任何重复的phone都会导致删除。

这是我的尝试,但显示错误

在我的 sql 文件中

CREATE TABLE `my_table` (
  `id` int(10) NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  `address` varchar(255) NOT NULL default '',
  `phone` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `my_table` VALUES (1, 'Albert', 'EGYPT', '202020');
INSERT INTO `my_table` VALUES (2, 'John', 'USA', '984731');
INSERT INTO `my_table` VALUES (3, 'Steve', 'Romabia', '202020');
INSERT INTO `my_table` VALUES (4, 'Albert', 'EGYPT', '343354');

非常清楚,ID 1和3的行具有相同的电话号码,然后将删除重复的,因此结果是

INSERT INTO `my_table` VALUES (1, 'Albert', 'EGYPT', '202020');
INSERT INTO `my_table` VALUES (2, 'John', 'USA', '984731');
INSERT INTO `my_table` VALUES (3, 'Albert', 'EGYPT', '343354');

我的尝试如何

我刚刚将以下内容添加到sql文件中

1-创建新表以获得不同的

CREATE TABLE my_temp(id VARCHAR(10), name VARCHAR(255), address VARCHAR(255), phone VARCHAR(255));
INSERT INTO my_temp(id,name,address,phone) SELECT DISTINCT id,name,address,phone FROM my_table;

2-从实际表中删除条目my_table

DELETE FROM my_table;

3-将条目从my_tamp表返回到实际my_table

INSERT INTO my_table(id,name,address,phone) SELECT id,name,address,phone FROM my_temp;

4-删除无用的表my_temp

DROP TABLE my_temp;

现在我的问题

它仍然会向我展示相同的内容

INSERT INTO `my_table` VALUES (1, 'Albert', 'EGYPT', '202020');
INSERT INTO `my_table` VALUES (2, 'John', 'USA', '984731');
INSERT INTO `my_table` VALUES (3, 'Steve', 'Romabia', '202020');
INSERT INTO `my_table` VALUES (4, 'Albert', 'EGYPT', '343354');

因为它不会认为没有重复,因为它们在 ID、名称、地址上有所不同

那么我如何调整我的方式,以便它删除重复项(如果有的话(,只有在手机中存在重复项时才无需注意ID,姓名,地址(如果不同(是否不同

提示

我已经调整了这部分

INSERT INTO my_temp(id,name,address,phone) SELECT DISTINCT phone FROM my_table;

但它会插入到my_temp表中

INSERT INTO `my_table` VALUES (1, 'null', 'null', '202020');
INSERT INTO `my_table` VALUES (2, 'null', 'null', '984731');
INSERT INTO `my_table` VALUES (3, 'null', 'null', '343354');

所以我将无法将数据恢复到my_table

我会按以下方式执行此操作:

  1. 从现有表创建临时表:

    CREATE TEMPORARY TABLE data_to_keep LIKE table_with_dupes_in_it
    
  2. 仅使用所需的记录填充临时表:

    INSERT INTO data_to_keep
    SELECT DISTINCT * FROM table_with_dupes_in_it
    
  3. 清空表

    TRUNCATE TABLE table_with_dupes_in_it
    
  4. 将数据从临时表返回到原始表

    INSERT INTO table_with_dupes_in_it
    SELECT * FROM data_to_keep;
    
  5. 收拾

    DROP TEMPORARY TABLE data_to_keep
    

请注意,如果相关表是一个大的。 如果它是一个大表,我倾向于使用真正的表而不是临时表,以免占用数据库服务器上的过多内存。

编辑以添加:

如果您只是担心部分重复(只有部分数据与以前输入的数据相同的行(,那么您需要使用 GROUP BY。 当您使用GROUP BY时,您可以将MySQL限制为仅返回包含给定数据的一行,而不是所有数据。

SELECT *
FROM table
GROUP BY column_name

您还应该考虑在不想保存重复数据的列上使用 UNIQUE 索引,这将防止用户首先插入重复数据。

SELECT * FROM my_table t1 
INNER JOIN my_table t2 ON t2.phone = t1.phone 
WHERE t1.id < t2.id

测试完成后,切换选择 * 以删除 t2.*(如果您希望保留较新的条目,请切换 DELETE t1.*(。