MySql更新语句中,经常会碰到需要使用子查询限定更新范围的情况,但是mysql更新语句是不支持子查询的
#例如这样当使用mysql条件更新时--最先让人想到的写法
UPDATE user SET isagent=1 WHERE uid IN (SELECT uid FROM user_agent)
#此语句是错误的,会报错 You can't specify target table 'xxx' for update in FROM
这是因为:
mysql的update的一些特点
1、update 时,更新的表不能在set和where中用于子查询;
2、update 时,可以对多个表进行更新(sqlserver不行);
如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;
3、update 后面可以做任意的查询,这个作用等同于from;
正确的方式是,例:
#简单的更新语句
UPDATE `user` u SET u.`status`=1 WHERE u.`isagent`='1'
#复杂的更新语句
例子1
update member m,(SELECT * FROM FansRole) r set m.agentlevel=(case r.FanskindID when 1 then 0 else r.FanskindID+2 end),m.`level`=r.FanskindID,m.isagent=1,m.`status`=1,m.agenttime=UNIX_TIMESTAMP(r.RegTime) where m.id=r.UserID
例子2
UPDATE order_mall a,(SELECT order_mall.id FROM `order_mall`,`order_goods` WHERE order_mall.`id`=order_goods.`order_id` AND order_goods.order_status=8 AND order_goods.order_goods_type=3) b
SET a.`status`=4
WHERE a.id=b.id