1.背景

​ 前几日打工的时候发现的一个神奇的bug 当我在NAVCATE(sqlserver)中用鼠标修改一条数据时会同时修改另一条数据,当时瞬间懵逼,然后定睛一看妈的这个表建表的时候没给id ,也没有其他唯一索引,修改数据时运行sql会同时修改这两条完全相同的数据。 大概就是这个意思,目标把一个b对应的int改为1 (表名:configtxt)

image

​ 要是相改最简单的方法肯定是把想改的数据删除,然后重新进行插入,但肯定不是最合理的办法,于是计划写一个sql解决这个问题

​ 首先经过测试上述问题mysql并不纯在,mysql在图形化界面修改一条数据的时候会附带limit 语句效果如下

UPDATE `dbo`.`configtxt` SET `int` = 2 WHERE `function` = 'b' AND `int` = 1 LIMIT 1

​ 想法的话就是通过先添加一个排序让两个相同的数据变的不相同结果如下

 SELECT row_number() OVER (ORDER BY [func] DESC) AS 'no', * FROM configtxt where [func]  = 'b'

image

​ 然后通过这个附加的字段进行条件进行修改

WITH t1 AS
(
   SELECT row_number() OVER (ORDER BY [func] DESC) AS 'no', * FROM configtxt where [func]  = 'b'
)
UPDATE t1
SET state = '1'--这个是参数
where [no] = 1