mysql同时更新多条记录的同一个字段

来源:互联网 发布:小程序 post php接收 编辑:程序博客网 时间:2024/06/06 03:05

以上是表数据及结构。

语句如下:

update change_lyt set wid=
(case id
    when 1 then 5
    when 2 then 6
    else 10
END)
where id in(1,2)

参考:http://www.cnblogs.com/bruceleeliya/p/3310137.html

上面的代码没有问题,但是要更新的值如果从数据表获取,那么问题就来了,代码如下
update change_lyt set wid=
(case id
    when 1 then (SELECT a.wid from (select tmp.* from change_lyt tmp) a where a.id=2)
    when 2 then (SELECT b.wid from (select tmp2.* from change_lyt tmp2) b where b.id=1)
    else 10
END)
where id in(1,2)

此处有两个问题,

1.代码执行后只更新了一条数据,因为执行第一次更新时id=1的wid更新成2,第二次更新id=2的wid时,获取到的id=1的wid=2,更新失败


2.SELECT a.wid from (select tmp.* from change_lyt tmp) a where a.id=2看这个语句,如果此处换成select wid from change_lyt where id=2再执行上面的更新,将会报错,
You can't specify target table ‘quenn’ for update in FROM clause

原因:mysql不能先select出同一表中的某些值,再update这个表(在同一语句中)。

详见:http://blog.csdn.net/liu19871112/article/details/6952461


悲剧了。。。

我将wid加上唯一索引后就更新失败了。实验的目的:

1、wid确保唯一
2、用户使用排序功能时可以交换wid的值,mysql实现就是更新wid的值实现交换

看来这个思路是行不通了。。。

产生这个问题的背景:

1.当用户发表文章时同时添加排序字段的值,添加之前每次取数据表中wid最大的值加1然后插入新的数据
2.用户可以使用排序功能进行文章排序,功能实现靠的是交换wid的值

那么问题来了:

由于多用户高并发问题,wid的值存在重复值,这是当初没考虑到的。由于wid值重复,无法进行排序了。现在只能考虑高并发的数据一致性了,保证wid的值不重复,最起码同一个用户id下的wid值插入时保证没有重复。

0 0