批量更新

3 篇文章 0 订阅
1 篇文章 0 订阅
业务要求:
oracle数据库后台执行update操作,要求备份原表,并提供回滚语句
测试:
由于是生产环境,所以必须测试无误后再进行操作

模拟生产环境建表,并插入数据
drop table nn1; --注:该语句是删表语句,只能在模拟测试环境时建表前用,生产库或者已有测试环境杜绝执行!!
create table nn1 (id number,name varchar2(20),age number);
insert into nn1 values(1,'wang',11);
insert into nn1 values(2,'wang2',12);
insert into nn1 values(3,'wang3',13);
insert into nn1 values(4,'wang4',14);
insert into nn1 values(5,'wang5',15);
insert into nn1 values(6,'wang6',16);
commit;

select * from nn1;


查看nn1表的数据

以nn1表为原始生产表,新建表nn2作为备份表
drop table nn2;--注:该语句是删表语句,只能在模拟测试环境时建表前用,生产库或者已有测试环境杜绝执行!!
create table nn2 as select * from nn1;

select * from nn2;

查看nn2表的数据

基本环境模拟完成,下面进行测试

更新nn1
update nn1 set nn1.age=18, nn1.name='nana' where id>3;
commit;
select * from nn1;

查看更新后原表的数据

可以看到,id从4开始的数据都变成了 nana,18
如果此时发现update操作出现了问题,需要回滚,但已经commit,
此时就要借助之前备份的表(nn2)进行恢复数据,
同样的使用update语句,但更改条件就成为原表(nn1)和备份表(nn2)的差异之处,
通过上述业务逻辑可知,修改后的nn1和nn2的数据变化为,name字段和age字段的部分数据发生了变化,并且id字段未发生变化
由此可以通过ID列为关联条件,修改条件为两表的name字段(或者age字段)数据不一致,这里我们采用name字段写出以下sql
update nn1 set (name,age) = (select name,age from nn2 where nn1.id=nn2.id)
where existsselect 1 from nn2,nn1 where nn2.name<>nn1.name);

该sql可以分成两部分看,首先
update nn1 set (name,age) = ( select name,age from nn2 where nn1.id=nn2.id)
更新语句主题,修改的字段为 name和age字段,关联条件为nn1.id=nn2.id
第二部分
where exists ( select 1 from nn2,nn1 where nn2.name<>nn1.name)
条件控制子句,要修改的行为nn1表的name字段和nn2表的name数据不一致的行

修改后的nn1表

回滚完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值