Oracle数据库保证数据完整的情况下修改字段精度

假设我们要修改order表中的total字段的精度

  • 当字段可为空时
alter table order modify (total NUMBER(24,4) NULL);
  • 当字段可以有默认值时,即给了默认值不会影响业务
    下面给出线上实际写法,假如该表有千万的数据量,执行此类脚本会耗时较长,用SqlUpgradeLog保证该脚本只执行一次,就算线上执行多次升级,只有第一次会对系统造成影响,提高系统的稳定性
declare
  size Int;
Begin
  size := 0;
  Select Count(1) Into size From SqlUpgradeLog Where ID = '脚本id';
  If size = 0 Then
  	--total改名为tmp_total
	execute immediate 'alter table order rename column total to tmp_total';
	
	--添加total字段,同时赋予我们需要的精度
	execute immediate 'alter table order add total NUMBER(24,4) default 0 NOT NULL';
	
	--重新把原值赋给total
	execute immediate 'update order set total = tmp_total';
	
	--删除tmp_total
	execute immediate 'alter table order drop column tmp_total';
	
    Insert Into SqlUpgradeLog(id,time,desc) values('脚本id',sysdate,'描述');
	commit;
  End If;
End;
  • 当字段不能给默认值,需先给null,后面改为not null
    注意:你得确保该字段没有空值
    下面给出线上实际写法,假如该表有千万的数据量,执行此类脚本会耗时较长,用SqlUpgradeLog保证该脚本只执行一次,就算线上执行多次升级,只有第一次会对系统造成影响,提高系统的稳定性
declare
  size Int;
Begin
  size := 0;
  Select Count(1) Into size From SqlUpgradeLog Where ID = '脚本id';
  If size = 0 Then
 	--total改名为tmp_total
	execute immediate 'alter table order rename column total to tmp_total';
	
	--添加total字段,同时赋予我们需要的精度
	execute immediate 'alter table order add total NUMBER(24,4) NULL';
	
	--重新把原值赋给total
	execute immediate 'update order set total = tmp_total';
	
	--把total改为not null
	execute immediate 'alter table order modify (total NUMBER(24,4) NOT NULL)';
	
	--删除tmp_total
	execute immediate 'alter table order drop column tmp_total';
	
    Insert Into SqlUpgradeLog(id,time,desc) values('脚本id',sysdate,'描述');
	commit;
  End If;
End;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值