sql update操作数据更新成功,返回的影响行数是0
2017年06月24日 10:32:16 浪子艳少 阅读数:24773 标签: udpate 影响行数 更多
个人分类: 数据库
版权声明:本文为博主原创文章,转载请附上此文章的链接。 https://blog.csdn.net/win7system/article/details/73658270
以前使用sql server, mysql时候,本能以为update操作返回的行数能判断对记录的操作结果,除了数据库异常,一般确实能反应操作的真实情况,但是,为何却出现update数据更新成功,反而返回影响行数为0的情况呢?
以为可以判断返回值是否大于0来判断更新是否成功,但是,下面的两种情况均返回0:
1、没有找到需要更新的数据
比如,我们进行update的时候,条件是id=5,但是id=5的数据不存在。这种情况下,更新是失败的,返回0,很正确;
2、要更新的数据和更新的值是完全一样的
比如,我们要对id=5的记录进行更新,把title变成hello。虽然这条记录存在,但是这条记录的title本来就是hello,那么,返回值也是0;
3、本身写的sql语句有问题
比如,update test set cid = ‘5244’ where cid is null or cid=‘’;
第一种情况可以快分析到,但是调查发现不是这种问题,第二种和第三种为啥会出现这样的问题呢? 调查日志发现,同一时间接受到了两条数据导致了二三的出现,所以,大家在碰到这样的问题的时候,看看是不是因为并发请求导致的。控制好自己的并发事物,不然就会怀疑update的这个操作喽~
重大补充:最近发现update操作使用返回的的影响行数来判断操作成功与否,有时候还与第三方持久化框架有关
使用原生的sql(或者mysql) 重复请求update操作的时候,如 update test set cid = ‘5244’;执行两次的时候发现,update返回影响行数为0。但是使用mybatis的时候,结果却不是这样的,执行两次的时候,发现update返回的影响行数始终是1。后面跟踪发现,原来mybatis这个第三方持久化框架返回来的是被匹配的影响行数,所以返回的始终是1,那如果想要以返回的行数作为判断结果,需要在mybatis连接数据库的时候加上参数:jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true