我的编程空间,编程开发者的网络收藏夹
学习永远不晚

oracle增加字段带默认值

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

oracle增加字段带默认值

在oracle 11gR2版本中,对大表增加带默认值的字段,需要拆分成多个步骤,否则会长时间锁表。如下图:

对260万数据的表加带默认值的字段,执行超过2分钟。

oracle增加字段带默认值

我们的规范做法步骤为:

(1)加字段

alter table  T_ORDER add tstatus varchar2(20);

(2)批量更新数据

declare

  n_count number;

begin

  select ceil(count(1)/100000) into n_count

  from T_ORDER where tstatus is null;

  for i in 1..n_count loop

    update T_ORDER set tstatus='1' where tstatus is null and rownum<=100000;

    commit;

  end loop;

end;

/

(3)增加默认值属性

alter table TABLE_NAME modify tstatus default '1' not null;

在19c中不再需要如此繁冗的操作了,添加带默认值的字段可以瞬间完成:

oracle增加字段带默认值

实验准备:  create table test(
owner varchar2(30),
object_name varchar2(128),
object_type varchar2(30),
created date
);
insert into test 
select owner,object_name,object_type ,to_Date('20190101','yyyymmdd')+60*dbms_random.value from all_objects;
commit;
--重复执行insert操作,插入200万数据
insert into test select * from test;
commit;

SQL> select count(1) from test;

  COUNT(1)
----------
   3461376

oracle11gR2版本:


会话1 会话2
结论1:在oracle11gR2版本中,进行添加列、修改列的默认值操作时,如果其他会话中没有未提交的ddl、dml操作,则可以瞬间完成。 SQL> set timing on
SQL> alter table test add col2 varchar2(10) ;

Table altered.

Elapsed: 00:00:00.00
SQL> 
SQL> 
SQL> alter table test modify col2 default '1';

Table altered.

Elapsed: 00:00:00.00
SQL> 
SQL> select count(1) from test where col2='1';

  COUNT(1)
----------
         0

Elapsed: 00:00:00.04

结论2:在oracle11gR2中,直接添加带默认值的列,执行时间和表的数据量相关 SQL> alter table test add col3 varchar2(10) default '1';

Table altered.

Elapsed: 00:01:49.02
SQL> SQL> SQL> 
SQL> alter table test add col4 date default sysdate;

Table altered.

Elapsed: 00:02:04.62

结论3:当有DML操作未提交时,添加带默认值的列将报错(获取独占锁失败)。添加列不带默认值时,会等待dml操作提交(释放行级锁)后才可执行完成。
SQL> set time on
15:17:50 SQL> delete from test where rownum=1;

1 row deleted.
SQL> set time on
15:18:11 SQL> alter table test add col5 varchar2(10) default '1';
alter table test add col5 varchar2(10) default '1'
            *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired Elapsed: 00:00:00.00
15:18:16 SQL>  alter table test add col5 varchar2(10);


15:17:54 SQL> commit;

Commit complete.
15:18:43 SQL>
Table altered.

Elapsed: 00:00:20.35
15:18:43 >

结论4:添加默认值带默认值、非空约束时,如果没有DML阻塞,可以瞬间完成;如果有DML操作未提交,则需等待直到DML操作提交才可完成 15:24:50 SQL> alter table test add col6 varchar2(10) default '1' not null;

Table altered.

Elapsed: 00:00:00.01


15:27:55 SQL>  delete from test where rownum=1;

1 row deleted.
15:28:01 SQL> alter table test add col7 varchar2(10) default '1' not null;

15:28:47 SQL> commit;

Commit complete.

15:29:04 SQL>
Table altered.

Elapsed: 00:00:09.27
15:29:04 SQL> 




oracle19c版本 实验准备操作相同,数据量基本一致
SQL> SQL>  select count(1) from test;

  COUNT(1)
----------
   3479400


会话1 会话2
结论5:在19c版本中,增加带默认值、无非空约束的列,可以瞬间完成。如果有DML操作未结束,仍需等待该操作完成才可以结束。 SQL> set timing on
SQL> alter table test add col3 varchar2(10) default '1';

Table altered.

Elapsed: 00:00:00.01
SQL> 
SQL> alter table test add col4 date default sysdate;

Table altered.

Elapsed: 00:00:00.02


SQL> set time on
15:43:01 SQL> delete from test where rownum=1;

1 row deleted.
15:43:07 SQL> alter table test add col5 varchar2(10) default '1';


15:43:03 SQL> commit;

Commit complete.

15:43:24 SQL> 
Table altered.

Elapsed: 00:00:05.76
15:43:24 SQL> 15:43:24 SQL>

在19c官方文档中有如下描述:

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Automatic-and-Manual-Locking-Mechanisms-During-SQL-Operations.html#GUID-1B08DE66-5ED8-4BEF-893B-B887E3A82D50

oracle增加字段带默认值

直译为

11.2版本中 alter table add column with default value的操作正常不会阻塞,但在使用supplemental log时会降级为阻塞操作。

实际测试该操作,将数据库开启最小辅助日志、表开启辅助日志( alter table testu.test2 add supplemental log data(all) columns;),然后对test表使用OGG同步。操作都可以瞬间完成。这里还没太明白,后续有进展再补充。

总结:

在11gR2版本中增加带默认值的列时,需要指定not null属性,即可瞬间完成;否则锁表时间较长。

在19c版本中 增加带默认值的列时,不管是否包含not null属性,都可瞬间完成。

操作需要在业务低峰期操作,避免操作时有dml操作对其造成阻塞。

感悟:

数据库中的DML操作,主要需要避免大事务造成的锁表时间长、占用redo及undo等资源巨大、资源不足时回滚操作不可控等问题;

DDL操作时除了操作时间,还需要考虑表的独占锁对其他操作的阻塞问题。

随着数据库版本的迭代,功能愈加完善,很多经验已经不再适用了。适用新版本数据库前,应该对规范、操作手册进行测试,与时俱进,提高效率。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

oracle增加字段带默认值

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle怎么增加字段并设置默认值

要在Oracle中增加一个字段并设置默认值,可以使用ALTER TABLE语句。例如,假设我们有一个名为"customers"的表格,其中有一个字段"email"。要在该表中增加一个名为"phone"的字段,并设置默认值为"12345678
2023-08-25

oracle怎么新增字段并设置默认值

要在Oracle数据库中新增字段并设置默认值,可以使用以下步骤:首先在表中新增字段,可以使用ALTER TABLE语句,例如:ALTER TABLE table_nameADD column_name data_type;然后设置默认值,
oracle怎么新增字段并设置默认值
2024-03-15

oracle如何给表字段加上默认值

要给表字段加上默认值,可以使用ALTER TABLE语句来修改表结构。下面是一个示例:ALTER TABLE table_nameALTER COLUMN column_name SET DEFAULT default_value;在这
oracle如何给表字段加上默认值
2024-04-09

oracle表怎么新增字段并设置默认值

在Oracle数据库中,新增字段并设置默认值可以通过以下步骤实现:使用ALTER TABLE语句来为表新增字段。例如,要为名为example_table的表新增一个名为new_column的字段,可以使用以下语句:ALTER TABLE e
oracle表怎么新增字段并设置默认值
2024-05-21

mysql怎么添加字段默认值

可以使用ALTER TABLE语句来添加字段并设置默认值。下面是一个示例:ALTER TABLE table_nameADD column_name varchar(50) DEFAULT 'default_value
mysql怎么添加字段默认值
2024-04-20

sql如何给字段添加默认值

要给字段添加默认值,可以使用ALTER TABLE语句的ALTER COLUMN子句来修改表的结构。以下是一些常见的示例:1. 在创建表时指定默认值:CREATE TABLE 表名 (列名 数据类型 DEFAULT 默认值);2. 在已存在
2023-10-20

mysql怎么新增字段并设置默认值

要向MySQL表中添加新字段并设置默认值,可以使用ALTER TABLE语句。例如,如果要向名为"users"的表中添加一个名为"age"的新字段并设置默认值为30,可以执行以下SQL语句:ALTER TABLE usersADD C
mysql怎么新增字段并设置默认值
2024-04-09

mysql怎么添加字段设置默认值

在MySQL中,可以使用ALTER TABLE语句来添加字段并设置默认值。例如,假设我们有一个名为users的表,现在想要向这个表中添加一个名为status的字段,并设置默认值为1,我们可以使用以下SQL语句:ALTER TABLE u
mysql怎么添加字段设置默认值
2024-04-09

oracle怎么给表字段设置默认值

在Oracle中,可以使用ALTER TABLE语句来给表字段设置默认值。以下是一个示例:ALTER TABLE table_nameMODIFY column_name DEFAULT default_value;在上面的示例中,将t
oracle怎么给表字段设置默认值
2024-04-09

navicat怎么设置字段默认值

要设置字段的默认值,可以按照以下步骤在Navicat中进行操作:1. 在Navicat中打开数据库连接,并选择要设置默认值的表。2. 在表的字段列表中,找到需要设置默认值的字段,并右键点击字段,选择"修改列"选项。3. 在"修改列"对话框中
2023-10-11

mysql如何设置字段默认值

在MySQL中,可以使用DEFAULT关键字来设置字段的默认值。在创建表时,可以通过DEFAULT关键字为字段指定默认值,例如:CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR
mysql如何设置字段默认值
2024-04-09

sqlserver怎么设置字段默认值

在SQL Server中,可以使用`DEFAULT`关键字来设置字段的默认值。例如,假设我们有一个名为`users`的表,其中有一个名为`age`的字段,我们想要将`age`字段的默认值设置为`18`,可以使用以下语法:```sqlCREA
2023-09-16

sqlserver如何修改字段默认值

要修改SQL Server中字段的默认值,可以使用ALTER TABLE语句并指定默认值。例如,如果要将字段的默认值从当前值更改为新值,可以执行以下操作:ALTER TABLE your_table_nameALTER COLUMN y
sqlserver如何修改字段默认值
2024-04-09

sqlserver字段怎么设置默认值

在SQL Server中,可以使用DEFAULT约束来设置默认值。以下是设置默认值的步骤:1、在创建表时,可以在字段定义中使用DEFAULT关键字来设置默认值。例如:CREATE TABLE Employees (ID INT PRIM
sqlserver字段怎么设置默认值
2024-04-09

如何设置MySQL的字段默认值

本篇文章给大家分享的是有关如何设置MySQL的字段默认值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.默认值相关操作我们可以用 DEFAULT 关键字来定义默认值,默认值
2023-06-06

access如何设置字段的默认值

在Access中,可以通过设置字段的默认值来指定该字段在每次插入新记录时的默认值。以下是在Access中设置字段的默认值的步骤:1. 打开Access数据库,并打开要设置默认值的表。2. 在该表中,选择要设置默认值的字段。3. 在上方的“字
2023-10-11

编程热搜

目录