文章目录

  • 需求
  • 使用场景
  • 举例的表结构
  • 解决方案
    • 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 userInfolimit 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插入前查询重复问题解决方案相关推荐

  1. MySQL插入汉字报错的解决方案

    MySQL插入汉字报错的原因是字符集的问题,MySQL默认使用的是Latin(拉丁文)字符集,可以在创建数据库时指定其字符集:CREATE DATABASE test DEFAULT CHARACTE ...

  2. mysql 插入前查重_插入新数据是直接查重,如果有重复则不插入数据

    mabatis的XML文件写法 INSERT INTO t_cluster_server (id,cluster_id,server_id) SELECT #{id}, #{clusterId}, # ...

  3. Mysql数据库中查询重复数据和去重数据 , 删除重复数据的sql及分析

    数据库中有重复数据时,用到哪些sql语句? 建表: CREATE TABLE `user` (`id` bigint(255) NOT NULL AUTO_INCREMENT,`name` varch ...

  4. php一条SQL语句mysql插入两条重复的数据

    今天晚上在做测试开发的时候,请求了一个最简单的Insert SQL 语句,数据库里竟然出现了两条数据!!! 经过反复的琢磨,觉着代码没有问题.做了很多的代码改动后依然不行. 通过这边文章我看到了一点思 ...

  5. mysql sql 语句 查询重复数据 并删除重复数据 只保留一条

    **#例1:根据手机号customer_id查询所有重复的数据** SELECT* FROMaad_apply_main WHEREcustomer_id IN (SELECTcustomer_idF ...

  6. c# mysql 插入 和 查询_C#访问和操作MYSQL数据库

    这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 添加引用后在你的 ...

  7. mysql 插入前查重_Mysql插入数据前查重

    常见插入数据的SQL insert into 插入数据库时会检查主键是否存在,存在会报错 replace into 替换数据库记录,需要表中有主键或者unique索引,如果数据库已存在的数据,会先删除 ...

  8. c# mysql 插入 和 查询_C#对数据库的操作(增删改查)

    1.[在web.config文件中配置] 2.[连接字符串] private static readonly string StrCon = ConfigurationManager.Connecti ...

  9. mysql插入\更新前+判断条件

    1.mysql插入前判断数据是否存在的操作 INSERT INTO table(field1, field2, fieldn) SELECT 'field1','field2', 'fieldn' F ...

最新文章

  1. 按钮垂直居中_带下拉按钮的动态图表
  2. URLRewriter在ASP.NET配置文件中的用法
  3. 几种网站后门排查 不全面
  4. SimMechanics/Second Generation倒立摆模型建立及初步仿真学习
  5. 【转】设计模式 ( 十七) 状态模式State(对象行为型)
  6. 回归的误差服从正态分布吗_盘点10大回归类型:总有一款深得你心
  7. 10kv电压互感器型号_电气行业需要知道的10KV电压互感器基本技术参数
  8. Python机器学习及实践+从零开始通往Kaggle竞赛之路
  9. Flex 结合sandy引擎创造
  10. python中字符串是对象吗_Python中关于字符串对象的一些基础知识
  11. Spss 的基本方法使用步骤
  12. 沙巴克服务器占用,传奇私服服务端里最完整的攻沙传送教程,直接飞皇宫和影之道方法...
  13. 计算机应用专业毕业设计模板,计算机应用毕业论文模板范文
  14. Python提取PDF中的信息,写入Excel
  15. 一般家用路由器买多大的合适_家用路由器选多少M(兆)的合适
  16. 计算机网络——路由器接口及静态路由配置
  17. 2018年应届毕业宇视科技嵌入式软件开发工程师面试笔试总结
  18. socket PHP:详细简单的socket TCP通信PHP实现
  19. ​Au入门系列之三:调整音量
  20. 快速接入百度地图定位、描点

热门文章

  1. 引用数据类型,进行排序,会影响原来的值
  2. Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码
  3. 2022-2027年中国银饰行业发展监测及投资战略研究报告
  4. 2021年全球与中国迷你麦克风行业市场运行现状及投资规划建议报告
  5. 软件测试用例 - QQ登陆
  6. c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解
  7. 数学建模之线性规划(含MATLAB代码)
  8. Level4_Unit1_娱乐_休闲娱乐的选择
  9. PTA 7-5 素数排位(10 分)
  10. 为什么在WiFi连接的环境中,电脑操作手机会卡?