求一句mysql语句,关于更新记录的

Walkline 2017-09-22 05:08:52
假设表user有3个字段:id、username、memo,username不允许重名,插入了n多记录

然后我要修改某条记录的username和(或)memo字段,如果:

1、只更新memo字段,更新前判断这条记录的username是否重名,但是肯定会出现重名,因为我只改memo不改username;
2、只更新username字段,但是新的username和其它记录的username重名,更新前不判断重名,那这条记录更新成功,但是会和其它记录重名


不知道这么说能不能明白。。。。。我的要求其实是,更新一条记录,在保证它不和其它记录的username重名的前提下,可以修改memo


求高手赐教~
...全文
509 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2017-09-26
  • 打赏
  • 举报
回复
from `recorders` as records left join  `userinfo` as uinfo on records.PIN = uinfo.ID inner join `classinfo` as cinfo on records.ClassName = cinfo.ID
Walkline 2017-09-26
  • 打赏
  • 举报
回复
引用 16 楼 zjcxc 的回复:
from `recorders` as records left join  `userinfo` as uinfo on records.PIN = uinfo.ID inner join `classinfo` as cinfo on records.ClassName = cinfo.ID
鹅妹子嘤!!!!!这可是连号称月薪2w的dba都解决不了的问题啊,大神就是大神~~~
zjcxc 2017-09-25
  • 打赏
  • 举报
回复
实际上,如果你的更新条件中有 id=$ID 明确更新哪一条的话,username 设置了唯一的情况下,直接更新就行了,不用那么多判断,因为更新后的 username 如果与某条记录的 username 重复的话,因为 username 已经设置了唯一(约束或索引),所以更新会直接抵账,程序上最多判断一下失败原因做出对应的信息提示就好了
Walkline 2017-09-25
  • 打赏
  • 举报
回复
引用 9 楼 zjcxc 的回复:
update 的那个是 mysql 的限制。。。。。。。。。。。。。。。。。。 改 left join 是可以的 ("update `userinfo` a left join `userinfo`  b on b.Username='$userName' set a.Username='$userName', Title='$title', CardNumber='$cardNumber', Memo='$memo' where 'a.id=4 and b.id is null");
有点眼花缭乱了。。。。。我最后还是用老办法,先select count(*)查重,where条件从之前的Username='$userName'变成了Username='$userName' and ID!={$id},这样就统计出来本条记录以外是否有重名了,然后后边照常update,等夸奖,明天结账
zjcxc 2017-09-25
  • 打赏
  • 举报
回复
update 的那个是 mysql 的限制。。。。。。。。。。。。。。。。。。 改 left join 是可以的 ("update `userinfo` a left join `userinfo`  b on b.Username='$userName' set a.Username='$userName', Title='$title', CardNumber='$cardNumber', Memo='$memo' where 'a.id=4 and b.id is null");
zjcxc 2017-09-25
  • 打赏
  • 举报
回复
id 唯一,username 唯一 insert tb (id, username) values( 4, '张三') on duplicate key update 这样不管是 id,重复,还是 username 重复,都会更新 但如果你是 values(4,'张三‘),则可能会因为先判断到 username 重复,导致更新了第一条 所以要用 insert on duplicate 控制的话,要知道你的查询是如何写的,才能确定是否能够准确实现
Walkline 2017-09-25
  • 打赏
  • 举报
回复
引用 13 楼 zjcxc 的回复:
处理前判断要考虑并发的控制,简单地说 处理时通过唯一来保证,不用考虑并发,因为唯一是内部实现的,已经考虑了并发的处理 所以 DB 的角度反而倾向后后者
额。。。。能不能再赠送一条。。。。。。。。 select records.CardNumber, records.PIN, uinfo.Username, uinfo.Title, cinfo.ClassName, records.VerifyType, records.EventType, records.State, records.Date from `recorders` as records, `userinfo` as uinfo, `classinfo` as cinfo where records.PIN = uinfo.ID and records.ClassName = cinfo.ID order by records.ID asc recorders表里的PIN是userinfo里的ID,userinfo里保存着Username,就是想一条语句都把它们关联好一次性查询到 但是ID是自增的且从1开始,PIN有可能是0,所以遇到where records.PIN = uinfo.ID就会把PIN=0的记录过滤掉,如果where后边加上or records.PIN=0又会出现几十倍的重复查询,不知道这个问题一般怎么解决呢?
Walkline 2017-09-25
  • 打赏
  • 举报
回复
引用 13 楼 zjcxc 的回复:
处理前判断要考虑并发的控制,简单地说 处理时通过唯一来保证,不用考虑并发,因为唯一是内部实现的,已经考虑了并发的处理 所以 DB 的角度反而倾向后后者
受教了,感谢!~
zjcxc 2017-09-25
  • 打赏
  • 举报
回复
处理前判断要考虑并发的控制,简单地说 处理时通过唯一来保证,不用考虑并发,因为唯一是内部实现的,已经考虑了并发的处理 所以 DB 的角度反而倾向后后者
Walkline 2017-09-25
  • 打赏
  • 举报
回复
引用 11 楼 zjcxc 的回复:
实际上,如果你的更新条件中有 id=$ID 明确更新哪一条的话,username 设置了唯一的情况下,直接更新就行了,不用那么多判断,因为更新后的 username 如果与某条记录的 username 重复的话,因为 username 已经设置了唯一(约束或索引),所以更新会直接抵账,程序上最多判断一下失败原因做出对应的信息提示就好了
其实吧,前置查重和后置判断出错原因,我更倾向前者,毕竟我也是前两天才知道唯一索引怎么用的
Walkline 2017-09-23
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
如果不设置唯一,对于第1种情况,只更新 memo, 那不需要任何检查,你都没动过 username ,所以更新不会导致 username  重复 对于第 2 种情况,where 条件加上: 新的username值  not in ( select username  from 表 )
mysql_query("update `userinfo` set Username='$userName', Title='$title', CardNumber='$cardNumber', Memo='$memo' where '$userName' not in (select Username from `userinfo`)"); You can't specify target table 'userinfo' for update in FROM clause 也不行。。。。。
Walkline 2017-09-23
  • 打赏
  • 举报
回复
引用 4 楼 ACMAIN_CHM 的回复:
insert on duplicate ....
引用 4 楼 ACMAIN_CHM 的回复:
insert on duplicate ....
username设置唯一索引,用insert into on duplicate key update 问题出现了 1 张三 教务主任 05131445 3 李四 数学 16096247 这是好人呐~ 4 Walkline 数学 16096247 这是好人呐~ 修改第四条记录,把username改成李四,最后结果就如上所示,好像insert不能用where,如果可以的话就判断一下id就好了
Walkline 2017-09-22
  • 打赏
  • 举报
回复
引用 4 楼 ACMAIN_CHM 的回复:
insert on duplicate ....
好主意。。。。。。
ACMAIN_CHM 2017-09-22
  • 打赏
  • 举报
回复
insert on duplicate ....
Walkline 2017-09-22
  • 打赏
  • 举报
回复
to 2楼:其实情况一和情况二都是一种情况的两种的可能性。。。。。。

也可能是我用select count(*)查重太落伍了,反正not in第一次见,我去研究一下,感谢先~
zjcxc 2017-09-22
  • 打赏
  • 举报
回复
如果不设置唯一,对于第1种情况,只更新 memo, 那不需要任何检查,你都没动过 username ,所以更新不会导致 username  重复 对于第 2 种情况,where 条件加上: 新的username值  not in ( select username  from 表 )
zjcxc 2017-09-22
  • 打赏
  • 举报
回复
直接设置上唯一索引就行了呗 alter table tb add unique( username )

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧