UPDATE语句可以分批更新数据吗?

Brodie 2010-05-27 01:33:15
有一张表A,字段f1, f2,我想更新数据,update A set f2 = f1;
有没有方法像查询分页那样, update A set f2 = f1 limit 1, 1000; 来分批更新数据。
...全文
1075 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
维博 2010-05-27
  • 打赏
  • 举报
回复
Update是T-sql中再简单不过的语句了,update table set column=expression [where condition],我们都会用到。但update的用法不仅于此,真正在开发的时候,灵活恰当地使用update可以达到事半功倍的效果。

假定有表Table1(a,b,c)和Table2(a,c),现在Table1中有些记录字段c为null,要根据字段a在Table2中查找,取出字段a相等的字段c的值来更新Table1。一种常规的思路,通过游标遍历Table1中字段c为null的所有记录,在循环体内查找Table2并进行更新,即用游标Cursor的形式。测试sql语句如下:

使用游标遍历方式更新
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]

create TABLE Table2
(
a varchar(10),
c varchar(10),
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds',null)
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)

Insert into Table2 values('赵','90')
Insert into Table2 values('钱','100')
Insert into Table2 values('孙','80')
Insert into Table2 values('李','95')
GO
select * from Table1

--3.通过游标方式更新
declare @name varchar(10)
declare @score varchar(10)
declare mycursor cursor for select a from Table1 where c is null
open mycursor
fetch next from mycursor into @name
while(@@fetch_status = 0)
BEGIN
select @score=c from Table2 where a=@name
update Table1 set c = @score where a = @name
fetch next from mycursor into @name
END
close mycursor
deallocate mycursor
GO
--4.显示更新后的结果
select * from Table1
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2

虽然用游标可以实现,但代码看起来很复杂,其实用Update根据子关联来更新只要一条语句就可以搞定了,测试代码如下:

使用带关联子查询的Update更新
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]

create TABLE Table2
(
a varchar(10),
c varchar(10),
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds',null)
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)

Insert into Table2 values('赵','90')
Insert into Table2 values('钱','100')
Insert into Table2 values('孙','80')
Insert into Table2 values('李','95')
GO
select * from Table1

--3.通过Update方式更新
Update Table1 set c = (select c from Table2 where a = Table1.a) where c is null
GO

--4.显示更新后的结果
select * from Table1
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
维博 2010-05-27
  • 打赏
  • 举报
回复
更新二个表的数据,要注意他们的键值关系,如果:B表引用A表的外键,因此要修改的话,先要修改B表,再修改A表,否则,可能触发外键的错误。同时更新两个表的数据,我将它理解为保证一个事务——即要不一起成功,要么一起失败,那么问题就很简单了,两个update语句,加一个事务声明就OK了:begin tranupdate TableB...update TableA...commit这就是“同时”更新的效果了。不信你可以试试,将其中一条update语句,故意写错,你看看其他两条记录有没有成功
dla001 2010-05-27
  • 打赏
  • 举报
回复
表有多少数据,表是什么类型的,引擎是INNODB不代表表也是
bancxc 2010-05-27
  • 打赏
  • 举报
回复
set rowcount 1000
或者
delete top
Brodie 2010-05-27
  • 打赏
  • 举报
回复
我对SQL还不太熟,现在要更新MYSQL一个大表的所有数据,引擎是INNODB,我不太确定,UPDATE的锁定级别,如果全表更新的话,会不会影响到并发的其它查询操作。
dla001 2010-05-27
  • 打赏
  • 举报
回复
@@rowcount <1 break

注意你的条件,别更新错了
lcw321321 2010-05-27
  • 打赏
  • 举报
回复
有区别吗,LZ想干什么?
dla001 2010-05-27
  • 打赏
  • 举报
回复

--- 2000
SET ROWCOUNT 5000;
WHILE 1 = 1
BEGIN
UPDATE dbo.LargeOrders
SET CustomerID = N'ABCDE'
WHERE CustomerID = N'OLDWO';

IF @@rowcount < 5000 BREAK;
END
SET ROWCOUNT 0;


And here's the solution in SQL Server 2005 using UPDATE TOP:

WHILE 1 = 1
BEGIN
UPDATE TOP(5000) dbo.LargeOrders
SET CustomerID = N'ABCDE'
WHERE CustomerID = N'OLDWO';

IF @@rowcount < 5000 BREAK;
END
FlySQL 2010-05-27
  • 打赏
  • 举报
回复
用子查询,不过要保证有唯一的主键

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧