MySQL 数据交换修改前怎么验证重复数据?

用户联系人表 手机号 mobile 字段唯一

现有数据

id userId mobile
1 1 18989898989
2 1 18900000000

修改用户联系人手机号时,可能的修改方式为交换两个人的手机号然后提交,一次性修改两条数据,把 id 为 1 的联系人手机号改为 18900000000,把 id 为 2 的联系人手机号改为 18989898989

操作由用户控制,可能修改成别的手机号,可能交换手机号
在修改数据前需要判断手机号是否唯一,以便给用户提示,现在想知道怎么达到效果,同一用户可能不止 2 个联系人,解决的方法最好能满足多数据相互交换手机号且验证加提示的效果

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

查这两条是不是唯一后,再修改提交。

3年前 评论
lyfireworks07 (楼主) 3年前
随波逐流

虚拟一个 中间商 :joy:

3年前 评论
lyfireworks07 (楼主) 3年前
我爱大可乐 3年前
lyfireworks07 (楼主) 3年前
我爱大可乐 3年前

把两个号码查出来,对应数据库条数统计,结果id是不是对应的这两条,是则修改,不是则走其他逻辑。

3年前 评论
lyfireworks07 (楼主) 3年前

mysql users table 设置 mobile 为 unique 索引


   $origin = User::findOrFail($request->id);
   $target = User::whereMobile($request->mobile)->first();
   $origin_mobile = $origin->mobile;
   DB::transaction(function(){
       if($target){
          $target->mobile = null;
          $target->save();
          $origin->mobile = $request->mobile;
          $origin->save();
          $target->mobile = $origin_mobile;
          $target->save()
       }else{
          $origin->mobile = $request->mobile;
          $origin->save();
       }
   });
3年前 评论
lyfireworks07 (楼主) 3年前
pan_zoe (作者) 3年前
lyfireworks07 (楼主) 3年前

删掉,重新写入

3年前 评论
哓东 3年前

砍掉这个功能, 完事。😂

3年前 评论
zpers 3年前

你这,想法好像有点问题,为什么这个功能要让程序来实现呢,我们的系统也有这问题,我就告诉他弄个假的手机号去后台修改三次,就交换过来了(同上面的中间商同学)

3年前 评论
lyfireworks07 (楼主) 3年前

"修改用户联系人手机号时,修改方式为交换两个人的手机号然后提交,一次性修改两条数据,把 id 为 1 的联系人手机号改为 18900000000,把 id 为 2 的联系人手机号改为 18989898989" 你这段话已经标明数据已经存在,而且你后续的功能是交换而已,那这个存在的手机号难道不是唯一的?如果已存在的手机号不是唯一的,你后续的修改为什么又要去保证唯一性

3年前 评论
lyfireworks07 (楼主) 3年前

你非想代码改,那就设置 unique 允许为null,要修改的时候把手机号设置为null,不会触发唯一索引

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!