案列:项目中一个基础数据,在新增的时候,已经判断过唯一的字段内容不能重复了,但是在云环境上,测试出了bug,新增时产生了两条一模一样的数据,我在本地测试时也重现了问题,快速点击新增两下,会有bug出现。代码如下:

解决方法一:加锁,很自然的选择了加锁,又不要改sql,easy的很,然而刚开始把锁加到serviceImpl里面了,导致任何锁都没有效果,锁是执行了,但是事务没有commit,第二次查还是查不到插入后的数据,后来把锁加到了Controller层,解决了问题。但是经理说这样实现方式不好,没有通过。(加锁可以解决单个服务器的并发异常,但是多个服务器的话还是会出现并发异常)

解决方法二:修改sql。在insert的时候加上where条件。本来以为也很简单呢,结果也是试了几次,查了几次才成功。

先放上成功的代码:

INSERT INTO ba_tag (id, partner_id, tag_name,tag_property, del_flag, creator,create_time, modifier, modify_time,ip_address) SELECT #{baTag.id}, #{baTag.partnerId}, #{baTag.tagName}, #{baTag.tagProperty}, #{baTag.delFlag}, #{baTag.creator}, #{baTag.createTime}, #{baTag.modifier}, #{baTag.modifyTime},#{baTag.ipAddress} WHERE NOT EXISTS (SELECT tag_name FROM ba_tag WHERE tag_name = #{baTag.tagName})

之前几个失败的代码:

1,INSERT INTO ba_tag (id, partner_id, tag_name,tag_property, del_flag, creator,create_time, modifier, modify_time,ip_address) VALUES #{baTag.id}, #{baTag.partnerId}, #{baTag.tagName}, #{baTag.tagProperty}, #{baTag.delFlag}, #{baTag.creator}, #{baTag.createTime}, #{baTag.modifier}, #{baTag.modifyTime},#{baTag.ipAddress} WHERE #{baTag.tagName} NOT IN(SELECT tag_name FROM ba_tag WHERE tag_name = #{baTag.tagName})

2,INSERT INTO ba_tag (id, partner_id, tag_name,tag_property, del_flag, creator,create_time, modifier, modify_time,ip_address) VALUES #{baTag.id}, #{baTag.partnerId}, #{baTag.tagName}, #{baTag.tagProperty}, #{baTag.delFlag}, #{baTag.creator}, #{baTag.createTime}, #{baTag.modifier}, #{baTag.modifyTime},#{baTag.ipAddress} WHERE tag_naem != #{baTag.tagName},

正确代码WHERE前面可以加上FROM DUAL也是可以正确执行的。加上FROM DUAL的代码可以在mysql 和sqlserver中执行,但是在oracle中不可以正确执行。

另补充一下:如果在设计表的时候把对应字段添加唯一约束的话,就能省很多事了(因为sql不能通用,所以最后还是修改了数据库的唯一约束,同时在页面加了遮罩效果来解决)。

示例解释:

INSERT INTO 表(

//要插入的字段 id, partner_id, tag_name,tag_property, del_flag, creator,create_time, modifier, modify_time,ip_address )

SELECT

//要插入的值,不能带括号,否则Operand should contain 1 column(s)

#{baTag.id}, #{baTag.partnerId}, #{baTag.tagName}, #{baTag.tagProperty}, #{baTag.delFlag}, #{baTag.creator}, #{baTag.createTime}, #{baTag.modifier}, #{baTag.modifyTime},#{baTag.ipAddress}

FROM DUAL

//dual是为了构建查询语句而存在的表

WHERE NOT EXISTS(SELECT tag_name FROM ba_tag WHERE tag_name = #{baTag.tagName} )

//判断tagName相同的值是否存在,存在则不添加 NOT可以根据情况省略

sql 比对-正常插入语句和insert增加判定条件语句

insert into  tablename( 属性1,属性2) values ('值1',‘值2’);

insert into  tablename(属性1,属性2) select '值1','值2' from dual where exists (select 1 from tablename where 子句);

Mysql INSERT加入WHERE条件相关推荐

  1. linux mysql 事务_linux下mysql Insert update delete 事务 用户管理

    linux下mysql Insert update delete  事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES ...

  2. mysql insert into select大量数据插入比较慢_史上最全MySQL锁机制

    本文主要记录学习MyISAM 和 InnoDB 这两个存储引擎. 为什么要学习锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制. 因为数据也是一种供许多用户共享的资源,如何保证数据并发访问的 ...

  3. MySQL关联left join 条件on与where不同

    以下的文章主要讲述的是MySQL关联left join 条件on与where 条件的不同之处,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两 ...

  4. MySQL INSERT的4种形态

    墨墨导读:MySQL中常用的四种插入数据的语句: insert ,insert select,replace into,insert into on duplicate key update,以下详述 ...

  5. MySQL——INSERT INTO

    INSERT INTO语句: INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (exp ...

  6. MySQL学习记录04where条件子句、联表查询、子查询

    文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...

  7. INSERT 语句 增加条件,条件成立插入,否则不插入

    不推荐用本文的方法 如果可以最好是为表增加 联合主键 ,本文介绍的方法会降低运行速度. 业务层插入数据,联合主键唯一 ,如果重复就插入失败,业务层通过查询确认信息是否已经插入即可. 问题描述: 遇到一 ...

  8. Mysql insert into + select 插入语句

    Mysql insert into + select 插入语句 语法结构 INSERT INTO 表名 (字段1, 字段2....) SELECT字段1,字段2.... FROM表名称 WHERE条件 ...

  9. mysql count函数加条件总结

    文章目录 前言 测试环境 准备工作 条件统计 总结 前言 最近发现在处理Mysql问题时,count()函数频繁上镜,常常出现在分组统计的情景下,但是有时候并不是使用group by分好组就可以直接统 ...

最新文章

  1. anconda安装后命令行中安装tensorflow报错
  2. TEASOFT 关于远程WEICHAT命令
  3. SpringBoot+jquery实现post提交表单并添加隐藏域属性完成编辑功能
  4. 酒厂选址(codevs 1507)
  5. tcp连接工具_基于Swoole如何搭建TCP服务,你掌握了吗?
  6. Android Vendor Test Suite (VTS) 作用及测试方法
  7. paip. c++ 调用.net dll 最好方式powershell 使用总结.
  8. Matplotlib显示灰度图
  9. 样本空间与事件集合,事件间的关系——概率论与数理统计(宋浩)
  10. vim+Vundle+vim-autoformat+astyle格式化代码
  11. CSS设置背景颜色为透明
  12. 大电流输出信号隔离转换模块
  13. java properties文件 变量_properties文件和环境变量
  14. 使用铝、金、铜做电极的CCD摄像机
  15. SqlServer 内存篇(四)—— 各部分内存不足特征及解决方法
  16. mysql 分销提成计算_销售人员工资计算表-2017销售人员工资提成计算表免费版-东坡下载...
  17. [第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇]Android 应用程序定制方案(生活类)...
  18. 2017展望之四:运营商能否老树开新花?
  19. 程序性能分析及性能测试
  20. 深度学习以最佳纳米尺度分辨率解决重叠单个分子的3D方向和2D位置,生成蛋白质图片...

热门文章

  1. 使用Unity+HTC VIVE做VR时如何创建用户体验较强的菜单
  2. 【甜椒ACM】博弈论入门(Nim、sg定理)
  3. Vue之 $set的使用
  4. 基于java下Springboot框架实现小区物业管理系统
  5. siege 用户登录_Siege高性能压测工具
  6. php filereader,FileReader API的使用
  7. 大数据必须框架-Azkaban
  8. SpringBoot创建项目依赖爆红
  9. 原型产品0.0.1完成,小开心一下:)
  10. 多元线性回归—自相关