热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle中表添加带有默认值列的讨论(包括11G新特性)

这个问题为什么要讨论呢,是有历史根源的,我们从Oracle10G开始说起。在11G以前,一个大表,如果要添加一个新列,且新列有默认值

这个问题为什么要讨论呢,是有历史根源的,我们从Oracle 10G开始说起。在11G以前,一个大表,如果要添加一个新列,且新列有默认值

这个问题为什么要讨论呢,是有历史根源的,我们从Oracle 10G开始说起。在11G以前,一个大表,如果要添加一个新列,且新列有默认值,如果使用alter table xx add xx_1 number default 1000; 这类语句设置,那将非常杯具!

它的动作其实就是,添加一个列,然后对这一列进行更新,如果这个表非常大,那么将会产生一个非常大的事务。

而且因为它是ddl操作,它甚至会导致关于该表的select语句都被堵塞!后果非常可怕。

我们在10G中,遇到这种需求怎么办呢?

简单来说,就是先添加一列(不设置默认值)

之后通过使用PL/SQL 对这一列进行批量提交更新(比如1000行 一提交)

好处是,不会锁太多的行,而且每个事务都不大,出现故障之类的,不会产生死事务

或者可以使用在线重定义的方式。 ,参考我的这篇博客

到了11G中,我们对于表添加一列 带有默认值,有了新特性

我们来测试一下,创建表t,100多万数据。

SQL> select count(*) from t;

COUNT(*)
----------
1207317

对表加了一列,并设置not null 加默认值

SQL> alter table t add MrDai number default 10000 not null;

Table altered.

Elapsed: 00:00:00.34

速度飞快

这里其实只是在数据字典中做了一个标记,并不会对块中行的实际数据进行修改,所以速度飞快

我们查询的时候,会对新列做一个类似nvl()之类的操作,如果是null,则返回默认的数值。

在设置完成以后,如果是新插入的行,在默认值列,会将数据真正的插入到行

总结一下,这个特性类似于 给表设了一个断点, 断点之前的,如果该列是null,则对其转换为 默认值,而断点之后的,,该列会插入真正的值

这篇文章 对该特性有dump过程,可以参考阅读。

如果想让新列,之前的都为null,而之后的数据则有默认值,也可以,分两步

alter table t add MrDai number ;

alter table t modify MrDai number default 10000;


推荐阅读
  • MySQL学习指南:从基础到高级
    本文档提供了MySQL的全面学习指南,涵盖从数据库的基本概念到高级特性的详细解析,包括SQL基础命令、数据完整性约束、查询技术、内置函数、存储过程、视图管理、事务处理和索引优化等内容。 ... [详细]
  • 深入理解SQL Server中的聚集与非聚集索引
    本文探讨了SQL Server数据库中两种主要的索引类型——聚集索引和非聚集索引,通过对比分析它们的特点及应用场景,旨在帮助读者更好地理解和利用这两种索引以优化查询性能。 ... [详细]
  • 本文探讨了在H2内存数据库中使用to_char函数遇到的问题,包括别名创建失败和堆栈内存溢出的情况,并提供了解决方案。 ... [详细]
  • 本文深入探讨网页游戏的开发流程,涵盖从程序框架设计到具体实现的技术细节,旨在为开发者提供全面的指导。 ... [详细]
  • GBase 8s SQL 指南:多列约束详解
    本文档详细介绍了如何在GBase 8s中使用多列约束格式,将其应用于现有表的一列或多列。这种格式类似于CREATE TABLE语句中的多列约束,但提供了一些额外的选项,如INDEX DISABLED关键字。 ... [详细]
  • PySpark实战:高效使用DataFrame超越RDD
    本文深入探讨了PySpark中DataFrame的使用方法及其相对于传统RDD的优势,旨在帮助开发者更好地理解和利用这一强大工具。 ... [详细]
  • 今天发现Mysql的主从数据库没有同步先上Master库:mysqlshowprocesslist;查看下进程是否Sleep太多。发现很正常。showmaster ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 本文探讨了Java编程中MVC模式的优势与局限,以及如何利用Java开发一款基于鸟瞰视角的赛车游戏。 ... [详细]
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
  • 基于Java的学生宿舍管理系统设计
    本论文探讨了如何利用Java技术设计和实现一个高效的学生宿舍管理系统。该系统旨在提高宿舍管理的效率,减少人为错误,同时增强用户体验。通过集成用户认证、数据管理和查询功能,系统能够满足学校宿舍管理的多样化需求。 ... [详细]
  • 本文介绍了MySQL数据库的安全权限管理思想及其制度流程,涵盖从项目开发、数据库更新到日常运维等多个方面的详细流程控制,旨在通过严格的流程管理和权限控制,有效预防数据安全隐患。 ... [详细]
  • MyBatis 开发技巧:延迟加载与查询缓存详解
    本文详细探讨了 MyBatis 中的延迟加载和查询缓存机制,旨在帮助开发者更好地理解和利用这些特性来优化数据库访问性能。 ... [详细]
  • 本项目展示了如何利用Java技术构建一个高效的考勤数据管理系统,特别适用于处理大量数据的情况,如企业员工考勤记录等。项目包括完整的源代码和详细的文档说明,适合用于毕业设计或实际工作场景。 ... [详细]
  • 本文详细解析了 SUCTF 2019 中的 EasySQL 题目,重点探讨了堆叠注入与 UNION 注入的区别及其应用条件。 ... [详细]
author-avatar
Susan林小夕
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有