mysql 多个表 update

知兮丶青
阅读(515) 2018-02-09
mysql 多个表 update
mysql 多个表 update

mysql没有update select语法,但有Multiple-table语法,可以内联更新,当然任何类型的联合也是可以的,如left join、right join、inner join。



UPDATE Multiple-table语法

来看看Multiple-table语法

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]



如何使用呢?

首先2建表个表作为演示用:

-- 用户表
CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `type` int DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- 学生表
CREATE TABLE `student` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `type` int DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向两个表插入几条测试数据

INSERT INTO `user`(`name`,`type`) values('张三',1);
INSERT INTO `user`(`name`,`type`) values('李四',1);
INSERT INTO `student`(`name`,`type`) values('zhangsan',2);
INSERT INTO `student`(`name`,`type`) values('lisi',2);


使用multiple-table UPDATE从user表更新数据到student表(下面作为参考的方式但仅不限于此方式)

-- 逗号操作符的内部联合
UPDATE `student` s,`user` u SET s.`name`=u.`name`,s.`type`=u.`type` WHERE u.`id`=s.`id`;

-- left join更新
UPDATE `student` s LEFT JOIN `user` u ON u.`id`=s.`id` SET s.`name`=u.`name`,s.`type`=u.`type`;

-- left join条件更新
UPDATE `student` s LEFT JOIN `user` u ON u.`id`=s.`id` SET s.`name`=u.`name`,s.`type`=u.`type` WHERE u.`type`=1;

更新后

mysql> select * from student;
+----+------+------+
| id | name | type |
+----+------+------+
|  1 | 张三 |    1 |
|  2 | 李四 |    1 |
+----+------+------+
2 rows in set (0.00 sec)

注意:不能把ORDER BY或LIMIT与multiple-table UPDATE同时使用。

您不能在一个子查询中更新一个表,同时从同一个表中选择。


巧妙使用mysql子查询,但存在缺陷,适当地方可以这样用。

-- 子查询
UPDATE `student` s SET s.`name`=(SELECT u.`name` FROM `user` u WHERE u.id=s.id );



原创文章,转载请注明出处:https://www.weizhixi.com/article/73.html