iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >oracle增加字段带默认值
  • 687
分享到

oracle增加字段带默认值

2024-04-02 19:04:59 687人浏览 八月长安
摘要

在oracle 11gR2版本中,对大表增加带默认值的字段,需要拆分成多个步骤,否则会长时间锁表。如下图: 对260万数据的表加带默认值的字段,执行超过2分钟。 我们的规范做法步骤为: (1)加字段

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操作时除了操作时间,还需要考虑表的独占锁对其他操作的阻塞问题。

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

您可能感兴趣的文档:

--结束END--

本文标题: oracle增加字段带默认值

本文链接: https://www.lsjlt.com/news/46277.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • oracle增加字段带默认值
    在oracle 11gR2版本中,对大表增加带默认值的字段,需要拆分成多个步骤,否则会长时间锁表。如下图: 对260万数据的表加带默认值的字段,执行超过2分钟。 我们的规范做法步骤为: (1)加字段 ...
    99+
    2022-10-18
  • oracle怎么增加字段并设置默认值
    要在Oracle中增加一个字段并设置默认值,可以使用ALTER TABLE语句。例如,假设我们有一个名为"customers"的表格...
    99+
    2023-08-25
    oracle
  • sql如何给字段添加默认值
    要给字段添加默认值,可以使用ALTER TABLE语句的ALTER COLUMN子句来修改表的结构。以下是一些常见的示例:1. 在创...
    99+
    2023-10-20
    sql
  • MYSQL---字段的默认值
    一、背景         问题的原因也是十分简单,在csdn上随便百度就可以找到解决问题的方法,但为什么还要写这篇文章呢?因为在去尝试的时候自己遇到了一些有趣的问题,并且从中也学到了有意思的知识。        报错: java.sql.S...
    99+
    2023-09-30
    mysql 数据库
  • navicat怎么设置字段默认值
    要设置字段的默认值,可以按照以下步骤在Navicat中进行操作:1. 在Navicat中打开数据库连接,并选择要设置默认值的表。2....
    99+
    2023-10-11
    navicat
  • SpringDataJPA设置字段默认值方式
    目录Spring Data JPA设置字段默认值Spring Data JPA设置字段默认值失败Spring Data JPA设置字段默认值 在Column注解中写入以下两个属性,为...
    99+
    2022-11-12
  • sqlserver怎么设置字段默认值
    在SQL Server中,可以使用`DEFAULT`关键字来设置字段的默认值。例如,假设我们有一个名为`users`的表,其中有一个...
    99+
    2023-09-16
    sqlserver
  • Sequoiadb给表增加字段后设置默认值无效的问题怎么解决
    这篇文章主要讲解了“Sequoiadb给表增加字段后设置默认值无效的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Sequoiadb给表增加字段...
    99+
    2022-10-18
  • 如何设置MySQL的字段默认值
    本篇文章给大家分享的是有关如何设置MySQL的字段默认值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.默认值相关操作我们可以用 DEFAULT 关键字来定义默认...
    99+
    2023-06-06
  • MySQL表字段时间设置默认值
    应用场景 在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间。 在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意记录,而...
    99+
    2022-05-22
    MySQL 字段时间默认值 MySQL 字段默认值
  • MySQL 字段默认值该如何设置
    前言:  在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默...
    99+
    2022-05-17
    MySQL 字段 MySQL 字段默认值 MySQL 字段默认值设置
  • MySQL中怎么设置字段默认值
    本篇文章为大家展示了MySQL中怎么设置字段默认值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.默认值相关操作我们可以用 DEFAULT 关键字来定义默认值,默...
    99+
    2022-10-18
  • access如何设置字段的默认值
    在Access中,可以通过设置字段的默认值来指定该字段在每次插入新记录时的默认值。以下是在Access中设置字段的默认值的步骤:1....
    99+
    2023-10-11
    access
  • mysql 给查询结果新增一个字段,并设定默认值
    SELECT "第一中学" as school, class, name, geography FROM test_table WHERE test = 1;    插入新table: REPLACE...
    99+
    2016-07-17
    mysql 给查询结果新增一个字段,并设定默认值
  • MySQL如何修改字段的默认值和空值
    目录mysql修改字段的默认值和空值修改字段默认值修改字段值是否为空MySQL默认值NULL、空值、Empty String的区别如何选择?先说结论区别MySQL修改字段的默认值和空值 修改字段默认值 修改: ALTER...
    99+
    2022-08-29
  • MySQL中如何为字段设置默认值?
    在MySQL中,我们可以为表的字段设置默认值,以确保在插入新记录时,如果没有为该字段指定值,将使用默认值。这在许多情况下都非常有用,特别是当我们希望在插入数据时自动填充某些字段,或者当我们想要为字段提...
    99+
    2023-10-23
    mysql 数据库
  • mysql设置某字段默认值的方法
    这篇文章将为大家详细讲解有关mysql设置某字段默认值的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql设置某字段默认值的方法:1、加字段和设置默认值;2、通...
    99+
    2022-10-18
  • mysql 将date字段默认值设置为CURRENT_DATE
    我们是否可以在mysql中,将Date字段的默认值设置为CURRENT_DATE(当前日期)? 答案是8.0之前不可以,8.0.13之后可以。 比如在5.7版本中使用如下sql创建表,将会提示语法错误: CREATE TABLE `t_o...
    99+
    2023-08-31
    mysql
  • mysql如何增加字段的值
    本篇内容介绍了“mysql如何增加字段的值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • el-date-picker增加默认值 修改样式
    预期效果 默认是这样的 但希望是直接有一个默认的当天日期,并且字体颜色啥的样式也要修改(在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的,特此记录 官方文档 按照官方的说明,给v-m...
    99+
    2023-10-07
    前端 vue.js elementui
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作