sql语句 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

update后面使用order by的情况

什么时候有必要增加order by:假如一个表中有自增型或者唯一键id。当想实现对所有id都加一。就会用到类似如下的sql:

update teams set teamno=teamno+1
此时就会出现问题,假如有两行数据,一行的teamno=6,另一行的teamno=7。当执行teamno=teamno+1语句,6的值加上1变成7,但是还存在teamno=7的一行,那么就会出现重复而报错。解决办法是,
先让teamno=7的行执行更新,然后才让teamno=6的行执行更新。这样就不会出现重复冲突情况。使用 order by可以指定更新的顺序。

sql语句修改为:update teams set teamno=teamno+1 order by teamno desc

成功运行。

总结:因为主键,unique都会要求值是唯一的。更新会出现值重复错误。所以只有针对字段值限制是唯一的时候,使用update才有必要添加order by

参考自 :
https://www.cnblogs.com/wangtao_20/archive/2011/02/23/1962148.html
https://blog.csdn.net/win7system/article/details/73658270