mysql插入前查询重复问题解决方案
文章目录
- 需求
- 使用场景
- 举例的表结构
- 解决方案
- 1.添加唯一约束
- 2.分两条sql语句,先查询再判断是否插入
- 3.`insert`语句里加入`not exists`解决
- 4.使用`insert ignore into`
- 5.使用触发器
需求
在插入数据前先查询是否已经存在该数据,存在则不插入,不存在再插入
使用场景
用户注册前查询是否重名
举例的表结构
表名 | userInfo | |
---|---|---|
主键 | id | 无符号自增 |
其他 | userName | 用户名,不允许重名 |
password | 密码 |
解决方案
1.添加唯一约束
将userName设为唯一约束
,此时插入前不需要判断是否重名,直接插入,插入失败则重名
缺点
:不适用与约束可以null的情况,
举例:若某表内的每一行数据的关系逻辑结构是一颗树,所有子节点的pid是父节点的id,存在根节点的pid为null,此时若是将pid设为唯一约束,当pid为null的时候唯一约束失效
2.分两条sql语句,先查询再判断是否插入
这种写法其实存在问题,当这条接口被客户端短时间内多次调用时,在多线程环境下是有可能产生脏数据(重名)的,参照单例模式和操作系统的进程理解这种情况。
3.insert
语句里加入not exists
解决
从网上查到的写法,但是实际测试中发现会执行一次sql语句,插入了多行
Insert into userinfo(userName, password)
select #{userName},#{password} from userinfowhere not exists (select u.id from userinfo u where u.userName=#{userName})
可以加入limit 1
只取第一行,不过在测试上面的sql语句时发现存在一个问题:当表内无数据时没有插入数据
Insert into userinfo(userName, password)
select #{userName},#{password} from userinfowhere not exists (select u.id from userinfo u where u.userName=#{userName}) limit 1
#exist:存在,对于外层的每一条数据,判断exist()里面有没有查到数据,查到返回true,并把外层select查到是此条数据插入结果集中,返回false则跳过此条数据,不插入
#not exist:不存在,与exist()相反,查不到再插入到结果集中
#limit 1 只取第一行数据,防止重复插入多次
原因:
select #{userName},#{password} from userinfo
没有查到数据,后面的exists只是起到过滤前面已经查询到的数据的效果,当表内无数据时,select没查到,也就无法insert
解决方法:删掉from userInfo
和limit 1
Insert into userinfo(userName, password)
select #{userName},#{password}where not exists (select u.id from userinfo u where u.userName=#{userName})
继续优化:
Insert into userinfo(userName, password)
select #{userName},#{password}where not exists (select 1 from userinfo u where u.userName=#{userName} limit 1)
原因:
from userInfo
是根据表内的数据查询,如果你知道select 'Hello'
这种写法,很容易理解为什么这样写 当删掉
from userInfo
时,select #{userName},#{password}
只返回一条结果,此时limit 1
也就没必要写了
4.使用insert ignore into
表⽰如果中已经存在相同的记录,则忽略当前新数据,但是对于部分重复的数据无效。例如userName相同但password不同,使用insert ignore into
会成功插入
当插⼊数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使⽤ignore请确保语句本⾝没有问题,否则也会被忽略掉。例如:
INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')
5.使用触发器
编写触发器,在插入前判断是否重名,重名则阻止插入,否则放行
mysql插入前查询重复问题解决方案相关推荐
- MySQL插入汉字报错的解决方案
MySQL插入汉字报错的原因是字符集的问题,MySQL默认使用的是Latin(拉丁文)字符集,可以在创建数据库时指定其字符集:CREATE DATABASE test DEFAULT CHARACTE ...
- mysql 插入前查重_插入新数据是直接查重,如果有重复则不插入数据
mabatis的XML文件写法 INSERT INTO t_cluster_server (id,cluster_id,server_id) SELECT #{id}, #{clusterId}, # ...
- Mysql数据库中查询重复数据和去重数据 , 删除重复数据的sql及分析
数据库中有重复数据时,用到哪些sql语句? 建表: CREATE TABLE `user` (`id` bigint(255) NOT NULL AUTO_INCREMENT,`name` varch ...
- php一条SQL语句mysql插入两条重复的数据
今天晚上在做测试开发的时候,请求了一个最简单的Insert SQL 语句,数据库里竟然出现了两条数据!!! 经过反复的琢磨,觉着代码没有问题.做了很多的代码改动后依然不行. 通过这边文章我看到了一点思 ...
- mysql sql 语句 查询重复数据 并删除重复数据 只保留一条
**#例1:根据手机号customer_id查询所有重复的数据** SELECT* FROMaad_apply_main WHEREcustomer_id IN (SELECTcustomer_idF ...
- c# mysql 插入 和 查询_C#访问和操作MYSQL数据库
这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 添加引用后在你的 ...
- mysql 插入前查重_Mysql插入数据前查重
常见插入数据的SQL insert into 插入数据库时会检查主键是否存在,存在会报错 replace into 替换数据库记录,需要表中有主键或者unique索引,如果数据库已存在的数据,会先删除 ...
- c# mysql 插入 和 查询_C#对数据库的操作(增删改查)
1.[在web.config文件中配置] 2.[连接字符串] private static readonly string StrCon = ConfigurationManager.Connecti ...
- mysql插入\更新前+判断条件
1.mysql插入前判断数据是否存在的操作 INSERT INTO table(field1, field2, fieldn) SELECT 'field1','field2', 'fieldn' F ...
最新文章
- 按钮垂直居中_带下拉按钮的动态图表
- URLRewriter在ASP.NET配置文件中的用法
- 几种网站后门排查 不全面
- SimMechanics/Second Generation倒立摆模型建立及初步仿真学习
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
- 回归的误差服从正态分布吗_盘点10大回归类型:总有一款深得你心
- 10kv电压互感器型号_电气行业需要知道的10KV电压互感器基本技术参数
- Python机器学习及实践+从零开始通往Kaggle竞赛之路
- Flex 结合sandy引擎创造
- python中字符串是对象吗_Python中关于字符串对象的一些基础知识
- Spss 的基本方法使用步骤
- 沙巴克服务器占用,传奇私服服务端里最完整的攻沙传送教程,直接飞皇宫和影之道方法...
- 计算机应用专业毕业设计模板,计算机应用毕业论文模板范文
- Python提取PDF中的信息,写入Excel
- 一般家用路由器买多大的合适_家用路由器选多少M(兆)的合适
- 计算机网络——路由器接口及静态路由配置
- 2018年应届毕业宇视科技嵌入式软件开发工程师面试笔试总结
- socket PHP:详细简单的socket TCP通信PHP实现
- ​Au入门系列之三:调整音量
- 快速接入百度地图定位、描点
热门文章
- 引用数据类型,进行排序,会影响原来的值
- Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码
- 2022-2027年中国银饰行业发展监测及投资战略研究报告
- 2021年全球与中国迷你麦克风行业市场运行现状及投资规划建议报告
- 软件测试用例 - QQ登陆
- c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解
- 数学建模之线性规划(含MATLAB代码)
- Level4_Unit1_娱乐_休闲娱乐的选择
- PTA 7-5 素数排位(10 分)
- 为什么在WiFi连接的环境中,电脑操作手机会卡?