MySQL一条语句更新多个表的方法

MySQL本身是支持一条update语句更新多个表的,有时候这是非常有用的一个特性。

Multiple-table syntax

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] …
    [WHERE where_condition]</pre>

于是继续找table_references说明; 

table_references:
    escaped_table_reference [, escaped_table_reference] …

escaped_table_reference:
    table_reference
  | { OJ table_reference }

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [[AS] alias] [index_hint]
  | table_subquery [AS] alias
  | ( table_references )

可以看到,update的关键词可以写多个表,每个表也可以是个子查询、也可以是join语句。

一个小尝试

在我的另一篇文章中,我已经用到了该语法:

 代码如下 复制代码

UPDATE table_a,table_b SET table_a.age=table_b.age WHERE table_a.id=table_b.id;

该语句中的table_b表也可以换成子查询、join子句,比如:

 代码如下 复制代码

UPDATE table_a,(SELECT id,age FROM table_b) AS tb SET table_a.age=tb.age WHERE table_a.id=tb.id;

如果不没明白我们再接一个小看一个例子就明白了。

 代码如下 复制代码

create table student
(
   student_id    int          not null
  ,student_name  varchar(30)  not null
  ,city_code     varchar(10)  null
  ,city_name     varchar(50)  null
);
create table city
(
   code varchar(10) not null
  ,name varchar(50) not null
);
insert into student values(1, 'john', '001', null);
insert into student values(2, 'nick', '002', null);

insert into city values('001', 'beijing');
insert into city values('002', 'shanghai');
insert into city values('003', 'shenzhen');

有两个表:student & city,现在需要取出 city.name 来更新 student.city_name。两表关联条件是

 代码如下 复制代码

student.city_code=city.code。

update student s, city c
   set s.city_name = c.name
 where s.city_code = c.code;

也可以试下面的相关子查询:

 代码如下 复制代码

update student s set city_name = (select name from city where code = s.city_code);

时间: 2024-09-20 07:24:29

MySQL一条语句更新多个表的方法的相关文章

sql语句更新-SQL更新的问题,6个字段本来可以一条语句可以更新搞定的,领导非要扯开六条语句更新

问题描述 SQL更新的问题,6个字段本来可以一条语句可以更新搞定的,领导非要扯开六条语句更新 这种更新方法更好 更优?(本人倾向这种) update tableA set FieldA='A', FieldB='B', FieldC='C', FieldD='D', FieldE='E', FieldF='F' where ID='3' 还是下面这种更新方法 哪种更好 更优 update tableA set FieldA='A' where ID='3' update tableA set F

oracle10-关于oracle在一条语句向多个表添加数据

问题描述 关于oracle在一条语句向多个表添加数据 我这里有t1,t2,t3三个表,当根据t3和t2中的某些条件做出的判断成立时,向t1和t2中添加数据,能不能这么写 insert all into t1(t1.column1,t1.column2) values(A,B) into t2(t2.column1,t2.column2) select t3.column1, t3.column2 from t3 where not exists (select 1 from t2,t3 wher

MySQL 中查找含有目标字段的表的方法_Mysql

复制代码 代码如下: SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.`COLUMNS` WHERE COLUMN_NAME='字段名字' 参考:MySQL中,一个字段在多张表都存在,怎么用sql语句一次性查询这些表呢

MySQL查询结果复制到新表的方法(更新、插入)_Mysql

MySQL中可以将查询结果复制到另外的一张表中,复制的话通常有两种情况,一种是更新已有的数据,另一种是插入一条新记录.下面通过例子来说明.首先构建两个测试表. 表t1: 表t2: 1.如果t2表中存在score值,将score更新到t1表中.方法如下: UPDATE t1,t2 SET t1.score = t2.score WHERE t1.id = t2.id AND t2.score IS NOT NULL 这就是将查询结果作为条件更新另一张表,当然,t2也可以是更为复杂的一个查询结果而不

mysql 基本操作记录语句

  以下以数据库"ceshi"为例 1.连接数据库 mysql -u username -p password 2.创建/删除数据库 创建:create database ceshi; 删除:drop database ceshi; 3.创建/删除数据表 创建:create table students (sid int(10) auto_increment primary key,name varchar(255),course varchar(255),score int(10))

hibernate表记录更新引发连接表数据被删问题

问题描述 我的项目中有两个表document.level,它们之间通过连接表实现关联,映射文件如下:表document<hibernate-mapping> <class name="com.unionmon.knowledge.model.KleDocument" table="KLE_DOCUMENT" schema="UFLOW"> <id name="kleDocumentId" type

MySQL数据库之UPDATE更新语句精解

用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.本文以MySQL为背景来讨论如何使有SQL中的更新语句. 一.INSERT和REPLACE INSERT和REPLACE语句的功能都是向表中插入新的数据.这两条语句的语法类似.它们的主要区别是如何处理重复的数据. 1. INSERT的一般用法 MySQL中的INSERT语句和标准的INSERT不太一样,在标准的SQL语句中,一次插入一条记录的INSERT语句只有一种形式

mysql 多个事务更新同一条记录产生死锁

问题描述 mysql 多个事务更新同一条记录产生死锁 以下是用show innodb status 查看的死锁信息,都是通过主键索引userId去更新记录,没有其他索引的影响,不应该会产生死锁啊,请大神帮忙分析下原因. 表索引如下 (.... PRIMARY KEY (userId), UNIQUE KEY userId_UNIQUE (userId), UNIQUE KEY userName_UNIQUE USING BTREE (userName) ) ENGINE=InnoDB AUTO_

如何写一个方法用SQL语句查询一张表中有多少条数据,方法改怎么写?

问题描述 如何写一个方法用SQL语句查询一张表中有多少条数据,方法改怎么写? 将查询的的返回值为整型 参考用例 类似 以下方法查询政治类新闻人数 新手不知道该如何改动成自己需要的方法 public Map<String, Long> sumPolEntNews(){ //查询政治类新闻人数总和 String sql = "select count(*) from t_user where newsh ='政治类新闻' "; Map<String, Long> m