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. 使用触发器和存储过程:通过编写自定义代码,可以在插入、更新或删除数据时自动执行检查和处理操作,以确保数据的一致性和准确性。

总之,了解如何有效地避免和管理数据重复非常重要。通过采取适当的预防措施和技术手段,我们可以确保数据库中的数据始终保持高质量、可靠和安全的状态。