mysqleupdate能更新id属性吗

mysqleupdate能更新id属性吗,第1张

能。在某些情况下我们需要向数据表中更新一条记录的状态,然后再把它取出来,但这时如果你在更新前并没有一个确认惟一记录的主键就没有办法知道哪条记录被更新了。

举例说明下:

有一个发放新手卡的程序,设计数据库时常见的方案有两种:

方案一:使用一张表,新手卡和领取记录都在一起,这样主要字段就是新手卡(主键)、用户ID(惟一)、领取状态(非必要)等

这样的话数据库 *** 作就简单了,直接一条update sql,将用户id更新到这张表里,然后根据用户ID再select出来就好了。但这样记录很多时就会有效率的问题,暂不讨论。

方案二:使用两张表,一张存放新手卡,另外一张存放领取记录。新手卡表里面有新手卡(主键)、新手卡状态等字段。

在 *** 作时也可以有两种方式:

一是先从新手卡表中select出一条记录,然后去更新它的状态,再之后插入到领取记录表中。

但这种方式最大的问题在于高并发情况下,会出现多个用户select出了同一条记录,这样就只能有一个人成功,其他人会失败。

二是先从新手卡中更新一条记录,然后取出这条记录插入到领取记录表中。由于是先update再select所以很好适应高并发的情况,

但是现在就遇到前面说的问题了:怎样获取刚才更新记录的ID呢?

下面代码是从stackoverflow上找到的答案,借用一下:

SET @update_id:=0UPDATE some_table SET row ='value',id =(SELECT @update_id:=id)WHERE some_other_row ='blah'LIMIT 1SELECT @update_id

大致思路就是首先声明一个用户变量 @update_id ,之后在update数据时要多更新一个字段,就是将当前主键值更新为当前主键值(其实就是没更新),更新主键字段并不是目的,只是为了将当前主键值赋值给@update_id,就是这句: ( SELECT @update_id := id )。 (个人理解,水平有限可能会有出入)

另外如果更新了多条记录也可以用下面的方式

SET @uids:=nullUPDATE footable

SET foo ='bar'WHERE fooid >5AND (SELECT @uids:=CONCAT_WS(',',fooid,@uids))SELECT @uids

注:上面的方法不适用于有HAVING、GROUP BY或者ORDER BY子句中,否则可能出入与预期不同的结果。

因为tb1.id等于tb2.tid的记录只有一条啊。所以你更新tb1表时只会更新一条。

如果你要的是tb2.tid所有记录的points之和,建议分成两条语句。

先取tb2.points和值:

select sum(points) from tb2 where tid= ...

再更新tb1

update tb1 set points = ... where id = ...

如果是要对tb2中所有记录作处理,

建议先建临时表,

CREATE TEMPORARY TABLE tb3 as select sum(points) point_total, id from tb2 group by id

再用更新语句

update tb1 t, tb3 c set t.points = t.points + c.point_total where t.id = c.id

记得执行成功后要删除临时表

drop table tb3

update 表 set 字段=replace(字段,'原始串','替换串') where id between '001' and '050'

--补充---

update 表 set 字段=replace(字段,'原始串','替换串') where id in(10,34, 41,43,56,81 )

---再补充---

比如你想保留10 34 41 43 56 81 ,而删除其他的,则

update 表 set 字段=replace(字段,'原始串','替换串') where id not in(10,34, 41,43,56,81 )

--覆盖掉--

update 表 set 字段=(select 内容 from 表 where id=1) where id in (10, 34,41)

把10 34 41这三个id的内容替换成和id=1的内容一样的

---删除---

delete from 表 where id in (10,34, 41)

这个是将这三行整行删除

update 表 set 字段 is null where id in (10, 34,41)

这个是将id为10,34,41的那个字段的内容设置为空数据,就是什么都不显示


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8736431.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存