当前位置: 首页 > Oracle, oracle 11g > 正文

oracle数据库表上的列何时使用默认值

为表的列添加默认值,并不是所以情况都会用到默认值,只有在插入数据时,没有明确指定这个列,才会用到默认值,以下是测试用例,数据库版本11.2.0.4,操作系统版本为OEL 6.5。

首先创建测试表。

SQL> create table t_test(id number,name char(10));

Table created.

插入一条数据,name列为空。

SQL> insert into t_test values(1,'');

1 row created.

SQL> commit;

Commit complete.

修改name列的默认值为’X’。

SQL> alter table t_test modify name default 'X';

Table altered.

为已经存在空值的列添加默认值,不会修改已存在的数据,因此查询发现name列仍然为空。

SQL> select * from t_test;

        ID NAME
---------- ----------
         1

再次插入一条记录,name列使用’’的方式表示name为空。

SQL> insert into t_test values(2,'');

1 row created.

SQL> commit;

Commit complete.

查询会发现,并没有用到默认值,name列仍然为空。

SQL> select * from t_test;

        ID NAME
---------- ----------
         1
         2

插入一条新的记录,不指定name列。

SQL> insert into t_test (id) values (3);

1 row created.

SQL> commit;

Commit complete.

查询会发现,这条记录使用了默认值。

SQL> select * from t_test;

        ID NAME
---------- ----------
         1
         2
         3 X

插入一条记录,name列使用null的方式表示为空。

SQL>  insert into t_test values(4,null);

1 row created.

SQL> commit;

Commit complete.

查询会发现,name列也没有使用默认值。

SQL> select * from t_test;

        ID NAME
---------- ----------
         1
         2
         3 X
         4

这是因为在插入数据时,明确指定了name字段,oracle认为指定的就是你想要的,即使是空值,也是你想要的,所以就不会使用默认值。

下面再测试下非空列的情况,而列子已经存在控制,是不允许修改这个列为非空属性的。

SQL> alter table t_test modify name not null enable;
alter table t_test modify name not null enable
*
ERROR at line 1:
ORA-02296: cannot enable (DBDREAM.) - null values found

将这些控制赋值,然后修改这个列为非空属性,也就是非空约束。

SQL> update t_test set name='XX' where name is null;

3 rows updated.

SQL> commit;

Commit complete.

SQL> select * from t_test;

        ID NAME
---------- ----------
         1 XX
         2 XX
         3 X
         4 XX

SQL> alter table t_test modify name not null enable;

Table altered.

这时,明确指定空值就不被允许了,因为明确指定空值,oracle认为空值就是你想要的结果,而字段上又不允许有空值,就会报错,而不会去使用默认值。

SQL> insert into t_test values (5,'');
insert into t_test values (5,'')
                             *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("DBDREAM"."T_TEST"."NAME")

要使用列上的默认值,只有在插入时不明确指定这个字段,不管列上是否存在非空约束。

SQL> insert into t_test (id) values (5);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t_test;

        ID NAME
---------- ----------
         1 XX
         2 XX
         3 X
         4 XX
         5 X

新增加的列也是一样,对新插入的数据来说,如果要使用默认值,都不能在插入时,明确指定那个字段。

本文固定链接: http://www.dbdream.com.cn/2016/11/oracle%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a1%a8%e4%b8%8a%e7%9a%84%e5%88%97%e4%bd%95%e6%97%b6%e4%bd%bf%e7%94%a8%e9%bb%98%e8%ae%a4%e5%80%bc/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2016年11月24日发表在 Oracle, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: oracle数据库表上的列何时使用默认值 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , , ,

oracle数据库表上的列何时使用默认值:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter