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

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

现有数据

id userId mobile
1 1 18989898989
2 1 18900000000

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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 9

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

1个月前 评论
lyfireworks07 (楼主) 1个月前

虚拟一个 中间商 :joy:

1个月前 评论
lyfireworks07 (楼主) 1个月前
我爱大可乐 1个月前
lyfireworks07 (楼主) 1个月前
我爱大可乐 1个月前

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

1个月前 评论
lyfireworks07 (楼主) 1个月前

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();
       }
   });
1个月前 评论
lyfireworks07 (楼主) 1个月前
pan_zoe (作者) 1个月前
lyfireworks07 (楼主) 1个月前

删掉,重新写入

1个月前 评论
哓东 1个月前

砍掉这个功能, 完事。😂

1个月前 评论
zpers 1个月前

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

1个月前 评论
lyfireworks07 (楼主) 1个月前

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

1个月前 评论
lyfireworks07 (楼主) 1个月前

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

1个月前 评论

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