MySQL怎样删除重复数据,只保留一条?

这篇具有很好参考价值的文章主要介绍了MySQL怎样删除重复数据,只保留一条?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在实际工作开发过程中,常常会遇到数据库表中存在多条数据重复了,此时我们需要删除重复数据,只保留其中一条有效的数据;

针对这种场景,我们用SQL语句该怎么实现呢?

数据准备

建表语句:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(11) NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `test` VALUES (1, '张三');
INSERT INTO `test` VALUES (2, '李四');
INSERT INTO `test` VALUES (4, '张三');
INSERT INTO `test` VALUES (5, '王二');
INSERT INTO `test` VALUES (6, '护具');
INSERT INTO `test` VALUES (7, '无极');
INSERT INTO `test` VALUES (8, '护具');
INSERT INTO `test` VALUES (3, '空气');
INSERT INTO `test` VALUES (9, '王二');
INSERT INTO `test` VALUES (10, '几乎');
commit;

MySQL怎样删除重复数据,只保留一条?,Mysql,MySQL

查看重复数据,并筛选

select t.name,count(1) from test t where 1=1 group by t.name ;

MySQL怎样删除重复数据,只保留一条?,Mysql,MySQL

使用having语句进行筛选

select t.name,count(1) from test t where 1=1 group by t.name HAVING count(1) >1;

MySQL怎样删除重复数据,只保留一条?,Mysql,MySQL

对于重复数据,保留一条数据筛选

select t.name,min(id) as  id ,count(1) from test t where 1=1 group by t.name;

MySQL怎样删除重复数据,只保留一条?,Mysql,MySQL

删除重复数据

delete from test where id not in (
select  min(id)  from test t where 1=1 group by t.name ) ;

执行上述SQL语句,发现会报错:

delete from test where id not in (
select  min(id)  from test t where 1=1 group by t.name )
> 1093 - You can't specify target table 'test' for update in FROM clause
> 时间: 0.004s

导致这一原因的问题是:不能在同一表中查询的数据作为同一表的更新数据。

正确参考SQL:

(1) 创建一张表temp_table存储最终保留的数据。
create table temp_table as SELECT min( id ) as id FROM test t WHERE 1 = 1 GROUP BY t.NAME;
(2) 排除表temp_table中的数据,删除即可。
DELETE FROM test WHERE id NOT IN (SELECT * FROM temp_table);

成功删除重复数据!

MySQL怎样删除重复数据,只保留一条?,Mysql,MySQL
文章来源地址https://www.toymoban.com/news/detail-683795.html

到了这里,关于MySQL怎样删除重复数据,只保留一条?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SqlServer中根据某几列获取重复的数据将其删除并保留最新一条

    有时候,我们某个数据表中,可能有几列的数据都是一样的,此时我们可能想查询出这几列数据相同的所有数据行,并保留最新一条,将其他重复的数据删除。 假设我们有如下数据表: 此时我们可以使用 ROW_NUMBER 函数,根据某几列查询出重复数据的新的排序列,该排序列就

    2024年04月28日
    浏览(38)
  • SQL语句删除重复记录且只保留一条有效记录

    1. 查找表中多余的重复记录,重复记录是根据单个字段(name)来判断 2. 删除表中多余的重复记录,重复记录是根据单个字段(id)来判断,只留有id最小的记录 3. 删除表中多余的重复记录(多个字段),只留有id最小的记录 参考:https://blog.csdn.net/JineD/article/details/126875291

    2024年02月13日
    浏览(58)
  • SQL删除重复的记录(只保留一条)-窗口函数row_number()

    关于删除mysql表中重复数据问题,本文中给到两种办法:聚合函数、窗口函数row_number()的方法。 (注意:MySQL从8.0开始支持窗口函数) 测试数据准备:首先创建一个测试表test,插入一些测试数据,模拟一些重复数据(最终目标:删除重复数据,但不处理null行) 先查询下重复数

    2024年02月05日
    浏览(47)
  • MySQL大量脏数据,如何只保留最新的一条?

    因为系统的一个Bug,导致数据库表中出现重复数据,需要做的是删除重复数据且只保留最新的一条数据。 具体场景是这样的 当然有人会说上面的问题我们可以建一个 order_no + cost_id 的组合唯一索引,这样就算代码有bug但至少数据库表中不会有脏数据。 似乎这样就可以了,然

    2023年04月20日
    浏览(55)
  • 解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题

    有一个离奇的BUG,在查询时,第一页跟第二页有一个共同的数据。有的数据却不显示。 后来发现是在SQL排序时没用主键排序。 解决:使用主键排序 以下是我准备的举例,可以自己试试。 分页查询公式:分页查询–他的公式为(伪代码): [NOT] LIMIT (curPage-1)*pageSize,pageSize 执行

    2024年02月16日
    浏览(37)
  • 在 MySQL 数据库中删除重复记录的步骤

    当我们在处理数据库中的数据时,有时候会出现重复记录的情况,这些重复记录会影响数据的正确性,需要将其删除。下面是在 MySQL 数据库中删除重复记录的步骤: 首先,我们需要找到数据库表中的重复记录。可以使用以下 SQL 语句查询表中所有的重复记录: 其中, table_

    2024年02月15日
    浏览(72)
  • MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化

    数据库表介绍: table_a :主表(小表,表数据不可重复) table_b :流水表(大表,记录审核流水数据) 注:两表表结构大致一致,流水表增加一个审核状态的字段 业务逻辑: 主表保存唯一数据,流水表记录审核流水数据,用于后续展示,并在审核成功后插入主表,在插入流

    2023年04月08日
    浏览(65)
  • mysql -- 左连接一对多只取一条,去重重复字段

            例如,给你一张用户表,还有一张地区信息表(每条数据都是到省 - 市 - 县 的地区信息,具体到县区),用户表中有用户所在市区字段,你要根据 地区信息表 查用户的所在市区的市区编码。就会出现一个情况,用户表 左连接 地区信息表  根据市区信息去匹配,一

    2024年02月16日
    浏览(40)
  • mysql将多条数据合并成一条

    实现将多条数据合并为一条数据,在mysql中可以通过 GROUP_CONCAT 函数实现 解决方案:用 GROUP_CONCAT -- 主表单个字段单个id,对应子表多个id 多字段如何处理 GROUP_CONCAT(CONCAT_WS(\\\',\\\', type , typename ) SEPARATOR \\\',\\\') IN在子查询中不起作用group_concat,解决方法见 ↓ IN在子查询中不起作用group

    2024年02月12日
    浏览(37)
  • MySQL 数据抽稀 每分钟取一条

    假如原始数据为每5秒一个数据,现在想展示为每4分钟一条数据,先按照分钟数把除以4余数为0的行选出来,在按照 年月日 时分,做组内排序(窗函数ROW_NUMBER),最后再拿出序号为1的行。 以下每分钟一条 以下每4分钟一条

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包