举例说明下:
有一个发放新手卡的程序,设计数据库时常见的方案有两种:
方案一:使用一张表,新手卡和领取记录都在一起,这样主要字段就是新手卡(主键)、用户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的那个字段的内容设置为空数据,就是什么都不显示
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)