Mysql 删除重复数据保留一条有效数据:
一、Mysql 删除重复数据,保留一条有效数据
```sql
DELETE FROM SZ_Building WHERE id NOT IN (
SELECT t.min_id FROM (
SELECT MIN(id) AS min_id FROM SZ_Building GROUP BY BLDG_NO
) t
) ;
```
原理:根据字段对数据进行分组,查询出所有分组的最小ID(即要保留的不重复数据),将查询出来的数据(所有不重复的数据)存放到临时表中。从原来的表中删除ID不在临时表中的重复数据。
二、Mysql 删除重复数据(多个字段分组)
```sql
DELETE FROM SZ_Water_Level WHERE id NOT IN (
SELECT t.min_id FROM (
SELECT MIN(id) AS min_id FROM SZ_Water_Level GROUP BY CZBM,SJ,SW
) t
) ;
```
三、Mysql 查询出可以删除的重复数据
```sql
SELECT * FROM SZ_Building WHERE BLDG_NO IN (
SELECT BLDG_NO FROM SZ_Building GROUP BY BLDG_NO HAVING COUNT(1)>1
) AND id NOT IN (
SELECT MIN(id) FROM SZ_Building GROUP BY BLDG_NO HAVING COUNT(1)>1
);
```
补充:mysql删除重复记录并且只保留一条
准备的测试表结构及数据:插入的数据中A,B,E存在重复数据,C没有重复记录。
创建表并插入数据:```sql
CREATE TABLE `tab` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
INSERT INTO `tab` VALUES ('1','A');
INSERT INTO `tab` VALUES ('2','A');
INSERT INTO `tab` VALUES ('3','A');
INSERT INTO `tab` VALUES ('4','B');
INSERT INTO `tab` VALUES ('5','B');
INSERT INTO `tab` VALUES ('6','C');
INSERT INTO `tab` VALUES ('7','B');
INSERT INTO `tab` VALUES ('8','B');
INSERT INTO `tab` VALUES ('9','B');
INSERT INTO `tab` VALUES ('10','E');
INSERT INTO `tab` VALUES ('11','E');
INSERT INTO `tab` VALUES ('12','E');
```
使用HAVING关键字筛选出表中重复数据:
```sql
SELECT `name`, COUNT(1) FROM tab GROUP BY `name` HAVING COUNT(1) > 1;
```
可以通过分组语句从每种重复数据中都拿出一条标识,然后删除重复记录并且只保留一条。以下是两种方法:
方法一:
```sql
SELECT `name`, id FROM TAB GROUP BY `name` HAVING COUNT(1) > 1;
DELETE from tab where -- 删除所有的重复时间 Begin -- `name` in ( SELECT * from (SELECT `name`FROM TAB GROUP BY `name` HAVING COUNT(1) >1) tmp2 ) -- 删除所有的重复时间 END -- -- 但一些特定ID的记录不进行删除 Begin -- AND id NOT in( select id from ( SELECT `name`,id FROM TAB GROUP BY `name` HAVING COUNT(1) >1 ) tmp1 ) -- 但一些特定ID的记录不进行删除 END --
```
执行后最终结果。
方法二:
```sql
-- MySql如何删除所有多余的重复数据
-- 需要处理的数据,如:出现重复的数据,如:先用SELECT查询看看结果:
-- 方法一 SELECT * FROM t_user WHERE user_name IN ( SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1 ) AND id NOT IN ( SELECT MIN(id) FROM t_user GROUP BY user_name HAVING COUNT(1)>1 )
-- 方法一查询出的所有多余的重复记录:
```
首先,我们需要对给出的三个方法进行解析:
1. 方法一:查询出id最小的记录,即保留第一条记录。
2. 方法二:查询出所有重复的记录,这些记录与方法一的结果相同。
3. 方法三:查询出除最大(或最小)id之外的所有重复记录,关键在于选择保留哪一条记录。
接下来,我们将这三个方法合并为一个SQL语句,并在其中添加DELETE操作:
```sql
-- 删除方法一中不重复的记录
DELETE FROM t_user WHERE id NOT IN (SELECT MIN(id) FROM t_user GROUP BY user_name);
-- 删除方法二中多余重复的记录
DELETE FROM t_user AS t1 WHERE t1.id != (SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name = t2.user_name);
```
这两个DELETE语句分别用于删除方法一和方法二中不满足条件的数据。需要注意的是,在执行这两个DELETE语句之前,请确保已经备份好数据,以防止误删。
以下是根据您提供的内容重构后的代码:
```sql
-- 方法一(笨方法但容易理解)
DELETE FROM t_user
WHERE user_name IN (
SELECT t1.user_name
FROM (
-- 查询出所有重复的user_name
SELECT user_name
FROM t_user
GROUP BY user_name
HAVING COUNT(1) > 1
) t1
) AND id NOT IN (
SELECT t2.min_id
FROM (
-- 查询出所有重复的记录并各自只取其中一条(MIN(id)或MAX(id)都可以)
SELECT MIN(id) AS min_id
FROM t_user
GROUP BY user_name
HAVING COUNT(1) > 1
) t2
);
-- 方法二(推荐方法也容易理解)
DELETE FROM t_user
WHERE id NOT IN (
SELECT t.min_id
FROM (
-- 过滤出重复多余的数据,比如,如果所有记录中存在1条记录是user_name=zhangsan的,那么就取出它;
-- 如果所有记录中存在多条记录是user_name=lisi的,那么只取其中1条,其他的不查询出来
SELECT MIN(id) AS min_id
FROM t_user
GROUP BY user_name
) t
);
-- 方法三(推荐方法但不太容易理解)
DELETE FROM t_user
WHERE id IN (
SELECT t.id
FROM (
-- 关于所有存在相同user_name的记录,只查询出(保留)重复记录中的1条,假设这样查询出来的集合为A集合。在所有记录中,只要id不在A集合中的,都把它们查询出来
SELECT t1.id
FROM t_user AS t1
WHERE t1.id <> (SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name = t2.user_name)
) t;
```
在删除操作成功完成之后,数据将不再存在重复项。这意味着您已经成功地去除了所有重复的数据,使得数据库中的信息更加清晰和准确。
如果您对这个话题感兴趣,可以尝试以下方法来避免数据重复:
1. 在创建表时定义主键:为主键指定一个或多个唯一标识符,以确保每个记录都有一个唯一的键值。这样,数据库将自动检查新插入的记录是否已经存在于表中,从而避免重复数据。
2. 使用约束:添加唯一约束、外键约束等其他限制条件,以确保数据的完整性和一致性。这些约束有助于防止插入无效的数据或在更新操作中引入冲突。
3. 使用触发器和存储过程:通过编写自定义代码,可以在插入、更新或删除数据时自动执行检查和处理操作,以确保数据的一致性和准确性。
总之,了解如何有效地避免和管理数据重复非常重要。通过采取适当的预防措施和技术手段,我们可以确保数据库中的数据始终保持高质量、可靠和安全的状态。