在有序的数据库列表中,经常会使用到主键作为排序的某列。有时候,在删除或者插入数据的时候,需要将所有相关的数据进行更新。如果是简单的使用update函数,会出现冲突,如在某个数据库Info中,存储的数据为:
Id | Value |
1 | 10 |
3 | 20 |
5 | 30 |
2 | 40 |
4 | 50 |
假设Id为主键,因为某个原因,需要将Id=1的数据删除,但是要求Id得从1开始,且需要连续。这时候需要统一更新Id,将每个Id减1,一般的SQL语句为:
Update Info set Id=Id-1;
如果只是这样子,看起来没有问题,但是实际上好多时候回报错。因为更新的时候是按照数据的存储顺序更新的,所以当更新Id=3的时候时,此时Id=2的数据还未更新,所以就会出现冲突。
解决办法:在更新语句后边加上order by 关键词。即更新语句变为:
Update Info set Id=Id-1 order by Id;这样更新就不会再出现冲突了。