删除MySQL数据库中的重复行

时间:2011-12-30 11:00:29

标签: php mysql

我有以下数据库

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

2 个答案:

答案 0 :(得分:1)

我会按照以下方式进行:

  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
    
  6. 请注意,如果有问题的话,这可能会占用大量内存和/或存储空间 一个大的。如果它是一个大表,我倾向于使用真正的表而不是临时表,以免在数据库服务器上占用过多的内存。

    编辑添加:

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

    SELECT *
    FROM table
    GROUP BY column_name
    

    您还应该考虑在要保留重复数据的列上使用UNIQUE索引,这样可以防止用户首先插入重复数据。

答案 1 :(得分:1)

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

一旦你测试了它就把SELECT *切换到DELETE t2。*或者如果你想保留较新的条目,则删除t1。*。