MySQL重复与不重复问题
本文共 1,928 字,预计阅读时间 6 分钟
1.查询某个字段不重复的记录
当某个字段有重复的数据,而其他字段数据不一样时,需要查询这些不重复的记录,可以使用distinct关键字配合group by进行查询。
1)先看所有的数据
2)根据name查询不重复的记录
基本语法
select *, count(distinct name) from table group by name
查询结果
3)注意事项
如果包含了order by,那么必须放到group by后面;如果包含了limit,那么必须放到group by后面。
2. 解决数据重复插入问题
2.1环境准备
先建一个表并插入一条数据
create table user( id int not null primary key, name varchar(50), age int unique );
insert into user(id,name,age) values(1,"张三",13);
2.2 insert ignore基本用法
当插入的数据已经存在时,则忽略当前新数据。即语句可以正常执行,但不会报错,数据也不会更新。会出现的问题是插入若不是因为重复数据报错,而是因为其他原因报错的,也同样被忽略了,无法查看错误信息。
1)再使用相同的id插入值,会报错“Duplicate entry '1' for key 'PRIMARY'”
insert into user(id,name,age) values(1,"李四",22);
2)使用insert ignore进行插入,不报错,但是数据没有更新
insert ignore user(id,name,age) values(1,"李四",22);
由此可以看出,insert ignore可以解决插入重复数据的问题。当数据存在时,就不会插入。关键点是primary key约束存在,原因是insert在插入时会检查主键。
2.3 replace into基本用法
在插入数据时进行数据的替换,前提是表存在primary key或unique约束。原理是先根据主键判断数据是否存在,当数据存在时,会删除对应的数据,把当前的数据再插入,若不存在时则查询唯一约束是否存在,若不存在则直接插入新数据,若存在就会删除对应的数据,把当前的数据再插入。
replace into user(id,name,age) values(1,"李四",22);
此语句执行后,数据已发生了变化,如name由原来的"张三"变成了现在的"李四"。unique的用法和primary key类似。
2.4 insert ignore、replace into与insert into的区别
关键字 | 说明 |
insert into | 根据主键检查来插入,插入重复的数据会报错 |
insert ignore | 当数据存在时忽略新数据,不存在时插入(此时相当于insert into) |
replace into | 当数据存在时删除旧数据,插入最新数据,不存在时插入(此时相当于insert into) |
2.5 on duplicate key update
当primary或者unique重复时,则执行update语句,不重复时则直接执行insert语句。前提是表存在primary key或unique约束。
insert into user(id,name,age) values(1,"李四",22) on duplicate key update name = '王五',age=30
上面的语句在执行时,id为1的用户信息已存在,则不会插入新数据,而是根据主键把name和age进行更新,执行后数据如下图,数据已经根据主键修改了:
unique的用法和primary key类似。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!