oracle数据库表上的列何时使用默认值
Nov242016
为表的列添加默认值,并不是所以情况都会用到默认值,只有在插入数据时,没有明确指定这个列,才会用到默认值,以下是测试用例,数据库版本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
新增加的列也是一样,对新插入的数据来说,如果要使用默认值,都不能在插入时,明确指定那个字段。