如何在MySQL的SQL语句中避免数据唯一性冲突

MySQL在修改完每一行数据后都验证数据约束,而不是像SQL标准里执行完整条语句才验证。这样做带来的一个问题就是,如果一条SQL语句会改动多行数据,即使改动过程中违反了数据约束但改动后并不违反数据约束,也会被MySQ判为违反数据约束从而执行失败。

举例来说:
create table t (i int not null primary key);
insert into t(i) values (1), (2), (3), (4);
update t set i = i + 1;
-- ERROR 1062 (23000): Duplicate entry '2' for key 1

这个问题我没有找到完美的解决方法。但有几个在特定情况下有效的解法:
1)暂时删除相关约束,改动完数据后再加回去
2)在update语句中使用order by子句控制行改动次序,保证在任一行改动后都不违法约束。这个方法局限性比较大,有时我们是想交换两个不相邻行的值
3)使用一个临时值做中转(如一个没有被其它任何行使用的值,有些情况下NULL是一个不错的选择)。类似于程序设计中典型的交换两个变量值的方法
4)重新设计应用逻辑,尽量避免一次更改多行的情况出现


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值