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


以上是表数据及结构。

语句如下:

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值插入时保证没有重复。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值