oracle default not null,Oracle 11g对大表中添加DEFAULT值的NOT NULL字段速度有大幅度的提升...

本文探讨了在Oracle 11g中添加包含默认值的NOTNULL字段时,如何避免对大量数据进行更新,通过理解Oracle如何存储默认值和优化表结构,缩短alter table操作时间。实验表明,不带NOTNULL约束的字段添加速度更快。

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

Oracle11g中,在添加一个包含DEFAULT值的NOT NULL字段,Oracle不会去更新现有的数据,Oracle需要做的不过是将默认值以及对应的表

今天同事问我一个问题他说在一张2000万的表上增加了一个字段并字段一个默认值,,执行这条语句(alter table tablename add new_col default ‘col’)一个小时没有执行完,问我有没有其他解决方法

我查了一下资料发现

Oracle11g中,在添加一个包含DEFAULT值的NOT NULL字段,Oracle不会去更新现有的数据,Oracle需要做的不过是将默认值以及对应的表信息、列信息一起存储在一个新增数据字典表ecol$中。这张表利用BLOB字段存储ALTER TABLE添加的DEFAULT值

然后我测试一下情况(在11g中测试alter table tablename add new_col default ‘col’ 后代not null和不带not null的区别)

1.新建一张表test

SQL> create table test (id number,name varchar(10));

表已创建。

2.向test表中插入500000记录

SQL> begin

2 for i in 1..500000 loop

3 insert into test values(i,'jack');

4 end loop;

5 end;

6 /

PL/SQL 过程已成功完成。

SQL> select count(1) from test;

COUNT(1)

----------

500000

SQL>

SQL> set timing on

3.向表中添加一个新的字段NEW_COL1带有默认值如下语句不带NOT NULL

ALTER TABLE t ADD NEW_COL1 CHAR(10) DEFAULT 'TESTCOLUMN'

SQL> ALTER TABLE test ADD NEW_COL1 CHAR(10) DEFAULT 'TESTCOLUMN';

表已更改。

已用时间: 00: 00: 43.23

SQL>

logo.gif

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

<think>好的,我现在需要解决用户的问题:在Oracle数据库中如何查询字段a.administration包含NULL和其他指定的情况。用户提到的字段是a.administration,可能需要同时筛选出该字段NULL以及某些具体的,比如比如'value1'、'value2'等。我需要先回忆Oracle中处理NULL的注意事项,以及如何结合多个条件进行查询。 首先,Oracle中处理NULL的时候,不能用普通的等于号(=)来判断,因为NULL未知或缺失的,所以必须使用IS NULL或者IS NOT NULL。例如,要查询administration为NULL的记录,应该写成a.administration IS NULL。 接下来,用户还需要查询包含其他具体的情况,比如可能的是'value1'和'value2'。这时候可以用IN运算符,比如a.administration IN ('value1', 'value2')。但是要注意,IN运算符不会包含NULL,因为NULL不能与任何(包括另一个NULL)相等。所以需要把这两个条件用OR连接起来。 因此,完整的WHERE子句应该是: WHERE (a.administration IN ('value1', 'value2')) OR (a.administration IS NULL) 不过,用户可能需要的是字段要么在指定的列中,要么为NULL。这时候需要注意运算符的优先级,避免逻辑错误。例如,如果写成a.administration IN (...) OR a.administration IS NULL,这样是正确的,但最好用括号明确优先级,尤其是在有其他条件的时候。 另外,可能需要考虑性能问题,比如当指定的很多时,使用IN是否效率会降低,或者是否有索引可用。不过用户目前的问题可能只是语法上的,所以暂时先给出正确的语法结构。 再检查用户提供的引用,特别是引用[1]提到NVL函数处理NULL,这可能也是一个方法。例如,使用NVL函数将NULL转换为某个默认,然后进行判断。例如: WHERE NVL(a.administration, 'default') IN ('value1', 'value2', 'default') 但这样可能会把原本为NULL的转换成'default',如果指定的中有'default'就会被包含进去。但这种方法可能不够直观,不如直接使用OR条件清晰。 引用[3]中的例子有WHERE sal > isal AND job = sjob,这可能说明在组合条件时需要注意各条件之间的关系,但这里的情况不同,用户需要的是OR逻辑。 总结,正确的语法应该是使用OR来连接IN条件和IS NULL条件,并且用括号确保逻辑正确。例如: SELECT * FROM table_a a WHERE a.administration IN ('value1', 'value2') OR a.administration IS NULL; 或者使用UNION ALL将两个查询结果合并,但这样可能效率不如前者。不过一般情况下,使用OR更为简洁高效,尤其是在有合适索引的情况下。 另外,用户可能需要示例,所以给出具体的SQL例子会有帮助。比如替换value1和value2为具体的,如'Admin'和'HR'等。 最后,生成相关问题时要围绕Oracle查询中的NULL处理、条件组合、函数使用等方向提问,帮助用户深入理解。</think>在Oracle中查询字段$a.administration$包含`NULL`和其他指定的语法,可以通过`OR`条件或`NVL`函数实现。以下是具体方法: --- ### **方法1:使用`OR`组合条件** 直接使用`IN`筛选具体,并通过`OR`连接`IS NULL`条件: ```sql SELECT * FROM table_a a WHERE a.administration IN ('value1', 'value2') -- 替换为实际 OR a.administration IS NULL; ``` - **说明**: - `IN`用于匹配具体(如`'value1'`, `'value2'`),而`IS NULL`捕获空[^1]。 - 括号可省略,但建议保留以明确逻辑优先级(尤其在复杂查询中)。 --- ### **方法2:使用`NVL`函数处理NULL** 将`NULL`转换为特定默认后统一筛选: ```sql SELECT * FROM table_a a WHERE NVL(a.administration, 'DEFAULT_VALUE') IN ('value1', 'value2', 'DEFAULT_VALUE'); ``` - **说明**: - `NVL(a.administration, 'DEFAULT_VALUE')`将`NULL`替换为`'DEFAULT_VALUE'`,使其可参与`IN`匹配[^1]。 - 需确保`DEFAULT_VALUE`不与实际业务数据冲突。 --- ### **性能对比** - **`OR`条件**:适合字段有索引且`IN`列较短时,效率较高。 - **`NVL`函数**:可能导致索引失效,需谨慎使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值