日期:2014-05-16  浏览次数:20758 次

mysql 批量修改数据的SQL

对于同一张表修改一批数据,等于另一批数据;或者对于两张表,修改A表一批数据,等于B表的一批数据。
oracle在这方面做到很好,SQL语法也比较简单,但Mysql做的不好,不是不能做,只是比较麻烦。

首先准备两张表:
emp: empno,ename,deptno,sal;(含义为员工编号,姓名,部门编号,工资)
myemp:myid,myname,deptno,sal; (含义为员工编号,姓名,部门编号,工资)

emp.empno 与 myemp.myid关联。

问题:
将emp表中 部门编号为10,主键empno等于myemp表中的myid,所有人员的【姓名,工资】批量同步过去,只能写一个语句。
?

下面是测试用的脚本:

SQL语句:

create table emp? (?
??? empno????? int(4),?
??? ename varchar(50),?
??? deptno varchar(5),
??? sal???? int(8)?
)?
?
create table myemp (
??? myid????? int(4),?
??? myname varchar(50),?
??? deptno varchar(5),
??? sal???? int(8)?
)?
)

insert into emp(empno,ename,deptno,sal) values ('1', '张三', '10', 1000);
insert into emp(empno,ename,deptno,sal) values ('2', '李四', '10', 2000);
insert into emp(empno,ename,deptno,sal) values ('3', '王五', '10', 3000);
insert into emp(empno,ename,deptno,sal) values ('4', '赵六', '20', 4000);
?


insert into myemp(myid,myname,deptno,sal) values ('1', 'zhangsan', '10', null);?
insert into myemp(myid,myname,deptno,sal) values ('2', 'lisi', '10', null);
insert into myemp(myid,myname,deptno,sal) values ('3', 'wangwu', '10', null);
insert into myemp(myid,myname,deptno,sal) values ('4', 'zhaoliu', '20', 4000);



最初想法是:

update myemp m

set m.sal = (select e.sal from emp e where e.deptno >'10' and m.myid = e.empno),

m.myname = (select e.ename from emp e where e.deptno >'10' and m.myid = e.empno);

实际上,这样mysql会报错。

Error Code : 1093
You can't specify target table 'a' for update in FROM clause
意思是,要修改的表,就不能在后面子查询语句中使用。


所以正确的方法:

update myemp as a inner join emp as b on a.myid=b.empno
set a.sal= b.sal,a.myname = b.ename
where b.deptno ='10'