我有以下数据库
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
我会按以下方式执行此操作:
-
从现有表创建临时表:
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 索引,这将防止用户首先插入重复数据。
SELECT * FROM my_table t1
INNER JOIN my_table t2 ON t2.phone = t1.phone
WHERE t1.id < t2.id
测试完成后,切换选择 * 以删除 t2.*(如果您希望保留较新的条目,请切换 DELETE t1.*(。