我有以下数据库
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
答案 0 :(得分:1)
我会按照以下方式进行:
从现有表格中创建临时表格:
CREATE TEMPORARY TABLE data_to_keep LIKE table_with_dupes_in_it
使用您想要的记录填充临时表:
INSERT INTO data_to_keep
SELECT DISTINCT * FROM table_with_dupes_in_it
清空表格
TRUNCATE TABLE table_with_dupes_in_it
将数据从临时表返回到原始表
INSERT INTO table_with_dupes_in_it
SELECT * FROM data_to_keep;
清理
DROP TEMPORARY TABLE data_to_keep
请注意,如果有问题的话,这可能会占用大量内存和/或存储空间 一个大的。如果它是一个大表,我倾向于使用真正的表而不是临时表,以免在数据库服务器上占用过多的内存。
编辑添加:
如果您只是担心部分欺骗(只有部分数据与先前输入的数据相同的行),那么您将需要使用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。*。