标签:
一. 多表更新
1. 数据准备
mysql> mysql> select goods_id, goods_name,goods_cate from tdb_goods; +----------+---------------------------------------+---------------------+ | goods_id | goods_name | goods_cate | +----------+---------------------------------------+---------------------+ | 1 | R510VC 15.6英寸笔记本 | 笔记本 | | 3 | G150TH 15.6英寸游戏本 | 游戏本 | | 4 | X550CC 15.6英寸笔记本 | 笔记本 | | 7 | SVP13226SCB 13.3英寸触控超极本 | 超级本 | | 9 | iPad Air MD788CH/A 9.7英寸 WiFi版 | 平板电脑 | | 10 | iPad mini ME279CH/A 7.9英寸 | 平板电脑 | | 14 | AT7-7414LP 台式电脑 | 台式机 | | 15 | Z220SFF F4F06PA工作站 | 服务器/工作站 | | 16 | PowerEdge T110 II服务器 | 服务器/工作站 | +----------+---------------------------------------+---------------------+ mysql> mysql> select *db_goods_cates; +---------+---------------------+ | cate_id | cate_name | +---------+---------------------+ | 1 | 台式机 | | 2 | 平板电脑 | | 3 | 服务器/工作站 | | 4 | 游戏本 | | 5 | 笔记本 | | 6 | 超级本 | +---------+---------------------+
2. 将tdb_goods表中的goods_cate字段更新为tdb_goods_cates表的cate_id字段
UPDATE tdb_goods g INNER JOIN tdb_goods_cates c ON g.goods_cate = c.cate_name SET g.goods_cate = c.cate_id;
二. 更新过滤条件中包含自身的表
1. 数据准备
----------------------------------------------------------------------------- mysql> select * from student; +----+--------+----------+---------+ | id | name | idCardNo | isCadre | +----+--------+----------+---------+ | 1 | Tom | 350020 | NULL | | 2 | Jim | 350022 | NULL | | 3 | Lucy | 460311 | NULL | | 4 | Liming | 733098 | NULL | +----+--------+----------+---------+ mysql> select * from cadre; +----+--------+----------+ | id | name | idCardNo | +----+--------+----------+ | 1 | Tom | 350020 | | 2 | Max | 636095 | | 3 | Liming | 733098 | +----+--------+----------+
2. 假设需要将student表中 与cadre表idCardNo字段相同的记录的isCadre更新为1
通常我们会这样写:
UPDATE student SET isCadre=1 WHERE student.idCardNo IN
(SELECT s.idCardNo FROM student s INNER JOIN cadre c ON s.idCardNo=c.idCardNo);
但是在MySQL中执行报错,“ERROR 1093 (HY000): You can‘t specify target table ‘student‘ for update in FROM clause”,MySQL不支持这种过滤条件中包含自身的更新(Oracle可以)。
正确的做法如下:
UPDATE student a JOIN (SELECT s.idCardNo FROM student s INNER JOIN cadre c ON s.idCardNo=c.idCardNo) b
ON a.idCardNo = b.idCardNo SET a.isCadre = 1;
标签:
原文地址:http://www.cnblogs.com/techroad4ca/p/5735064.html