巨坑,常见的update语句很容易造成Bug

在业务系统中,通过执行更新语句来更新数据是一项常见的任务。
开发人员经常通过查询更新的行数来做出业务决策。
然而,这项任务有一个问题。
在MySQL环境中,只有在实际发生更新时,更新语句影响的行数才大于0。
例如,假设您有一个只有一条记录且ID为1的表。
第一次执行更新操作时(例如更新ID为1的记录),影响的行数为1,符合预期。
然后再次执行相同的更新操作,返回的受影响行数为0。
这意味着当更新的目标记录与源记录的先前值完全相同时,MySQL实际上并没有执行更新操作。
也就是说,如果上游传递的数据与数据库中现有的值相同并且没有变化,则更新语句影响的行数将显示为0。
这使得它与“尝试更新不存在的记录,受影响的零行”的情况无法区分。
所以结论是:在做出重要的业务决策时,不要依赖更新语句影响的行数。

MYSQL的自增ID

MYSQL获取自增ID的四种方法1.selectmax(id)fromtablename2.SELECTLAST_INSERT_ID()函数与表无关。
如果将数据插入到表a,然后将数据插入到表b,则LAST_INSERT_ID。
会改变。
显然当多个用户交替插入数据时不能使用Max(id)。
此时,就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的。
只要每个线程使用独立的Connection对象,LAST_INSERT_ID函数就会返回Connection对AUTO_INCREMENT列的最新插入更新操作创建的第一条记录的ID。
该值不会受到其他客户端(连接)的影响,确保您可以检索自己的ID,而无需担心其他客户端的活动,也不会被锁定。
使用INSERT语句插入多条记录,LAST_INSERT_ID返回一个列表。
3.select@@IDENTITY;@@identity是指最近插入数据时对应的自增列的值,该表的身份属性(即自增列)由于确定系统而成为全局变量。
一般来说,系统定义的全局变量以@@开头,用户定义的变量以@开头。
例如,有表A,表中有一个自增列id。
当向A表插入一行数据时,如果插入数据后该列的值自动增加,则通过select获取该值。
@@identity将为101。
使用@@identity的前提是执行插入操作后,执行select@@identity时连接没有关闭,否则结果将为NULL4.SHOWTABLESTATUS中有一个Auto_increment字段对应的表名记录;在结果中。
包含下一个自动增量ID的值是表的当前最大自动增量ID。
@@identity和LAST_INSERT_ID()和mysql5.5的chm帮助器之间的区别是这样的:IdentityThisvariableisasynonymforthelast_insert_idvariable.Itexistsforcompatibilitywithotherdatabasesystems.YoucanreaditsvaluewithSELECT@@identity,andsetitusingSETidentity.。
看法re:last_insert_id从LAST_INSERT_ID()返回的值。
当您使用更新表的LAST_INSERT_ID()语句时,该值保存在二进制日志中。
设置此变量不会更新mysql_insert_id()CAPI函数返回的值。
@@identity是LAST_INSERT_ID()的同义词。
并没有太大的区别,不过下面我们继续看看对LAST_INSERT_ID()的理解。
Last_insert_id()正式描述了新的理解:生成的ID维护在服务器上的连接设施中。
这意味着提供给客户端的函数返回的值是该客户端为影响AUTO_INCRMENT列的最新语句生成的第一个值,即使其他客户端创建了自己的AUTO_INCRMENT值,该值也不会受到影响。

此行为确保每个客户端都可以检索自己的ID,而无需考虑其他客户端的活动,也不需要锁或事务。
Last_insert_id()函数的返回值不是基于整个数据库的insert语句。
它基于最近的插入语句