oracle 大表添加字段方法

本文介绍了Oracle大表添加字段并设置默认值的方法。在CentOS 6.5系统、Oracle 11.2.0.4数据库环境下,对千万级中小型堆表进行测试。对比两种方法,发现直接添加并设默认值耗时久,会刷新存量数据并产生表级锁,建议先添加字段,再在业务少的时段更新存量数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle 大表添加字段方法

近期,考虑到生产一线大表需要进行表结构更改,自身测试了一把,如下:

操作系统版本:centos 6.5
数据库版本:oracle 11.2.0.4
数据表:中小型堆表,千万级

  • 先分享一个创建测试表、序列、数据的小脚本

创建测试表

create table insert_test(
	id number,
	address varchar2(20),
	QRcode varchar2(20),
	password varchar2(30)
);

创建一个自用序列

create sequence wyl_seq
start with 1
increment by 1
nomaxvalue
nominvalue
nocycle
nocache;

插入12000000行数据,47分钟。。。。。

begin
	for i in 1 .. 12000000 loop
		insert into insert_test values(WYL_SEQ.NEXTVAL,'www.baidu.com',dbms_random.string('x', 20),dbms_random.string('p',30));
	end loop;
	commit;
end;
/

在这里插入图片描述

在这里插入图片描述

  • 现在进行加字段并设置默认值测试,主要有两种方法(一是直接添加并设置默认值,二是先添加,然后modify默认值

我们先测试一下第二种方法

alter table insert_test add str_te varchar2(10);
alter table insert_test modify str_te default '0';

在这里插入图片描述
发现很快就完成了,时间可以忽略不计,下面测试一下第一种方法

alter table insert_test add str_te varchar2(10) default '0';

在这里插入图片描述
竟然达到了21分钟。。。。

结论:alter table add
语句加上defalut时会刷新存量数据并产生表级锁,需慎用。特别是大表,生产环境,业务产生期间就应该禁止此操作。 改为add table
add不带缺省值,接着来个alter table aa modify column_1 varchar2(2) default
‘Y’;更新存量数据可放到业务较少的凌晨跑。

Oracle数据库中,给现有的添加一个新的字段是一项常见的任务。这可以通过使用 `ALTER TABLE` 语句完成。以下是详细的操作步骤以及需要注意的事项: --- ### **一、基本语法** ```sql ALTER TABLE 名 ADD (列名 数据类型 [约束条件]); ``` - **名**:要修改的目标名称。 - **列名**:新增字段的名称。 - **数据类型**:指定新字段的数据类型(例如 VARCHAR2, NUMBER, DATE 等)。 - **约束条件(可选)**:可以包括 NOT NULL、PRIMARY KEY 或其他约束。 --- ### **二、实例演示** #### 示例 1:向 `employees` 添加一个普通字段 假设有一个名为 `employees` 的员工信息,现在我们需要为其添加一个示邮箱地址的新字段 `email`: ```sql ALTER TABLE employees ADD (email VARCHAR2(255)); ``` 此命令将在 `employees` 中添加一个名为 `email` 的字段,其最长度为 255 字符。 #### 示例 2:添加约束条件的字段 如果我们希望该字段不允许为空(即设为必填),可以在创建时加入 `NOT NULL` 约束: ```sql ALTER TABLE employees ADD (phone_number VARCHAR2(15) NOT NULL); ``` 请注意,在实际应用中,如果已经有数据,那么直接添加有 `NOT NULL` 约束的字段可能会报错,因为现有记录没有对应的默认值。此时需要结合下一步操作——设置默认值。 --- ### **三、特殊情况处理** #### 1. 设置默认值后再添加非空字段 如果目标是要将新建字段设为 `NOT NULL` 并且保证已有数据符合要求,则应先设定默认值再调整属性: ```sql -- 步骤 1:添加字段并赋予初始值 ALTER TABLE employees ADD (hire_date DATE DEFAULT SYSDATE); -- 步骤 2:移除默认值并将字段标记为不可为空 ALTER TABLE employees MODIFY hire_date DATE NOT NULL; ``` #### 2. 删除多余或不再使用的字段 若发现某个字段已经失去用途或者需要清理冗余设计,可通过以下指令删除它: ```sql ALTER TABLE table_name DROP COLUMN column_name; ``` --- ### **四、注意事项** 1. **性能影响**:对于容量生产环境下的格而言,执行此类DDL改动可能会引发短暂锁定甚至降低查询效率,请尽量选择低峰时段进行维护。 2. **备份先行**:实施任何结构调整之前都
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值