ORACLE中默认值default的使⽤⽅法
在创建数据库表时,你可以指定⼀个 DEFAULT 值(即默认值)。对数据库字段使⽤默认值有助于将数据库设计问题与应⽤程序代码隔离。
可以在以后某个时候通过⼀条 ALTER TABLE 命令改变⼀个字段的默认值,改变之后应⽤程序代码会⽴即开始使⽤新值。
有⼀点是很重要的,即 DEFAULT 值只有当⼀个字段没有在 INSERT 或 MERGE 中指定值,或者使⽤了 DEFAULT 关键字时才会使⽤。如果你不显式地声明⼀个 DEFULAT 值,Oracle 将隐式地将默认值定义为 NULL,⽽且 DEFAULT 关键字也是这样。从 Oracle 9i开始,可以在 DEFAULT ⼦句中使⽤诸如 SYSDATE 或 CURRENT_TIMESTAMPE 之类的伪字段。例如:
create table t1
(
id$ integer not null,
charcol char default 'Y',
datecol date default sysdate,
strcol varchar2(30) default user,
intcol integer default 12
);
insert into t1 (id$) values (1);
select * from t1;
ID$ C DATECOL  STRCOL                            INTCOL
---------- - --------- ------------------------------ ----------
1 Y 28-MAY-04 SCOTT                                  12
DEFAULT 关键字与INSERT、MERGE 或UPDATE 语法⽐起来可以看上去没有那么必要,但是想⼀下如果你希望在插⼊⼀列数据时使⽤所有默认值,那么你就不会这么认为了。Oracle 不接受INSERT INTO <table> 或INSERT INTO <table> VALUES () 作为有效的 SQL。必须指定⾄少⼀个字段,但是
可以使⽤ DEFAULT 关键字来允许使⽤默认值,⽽⾮硬编码值,所以下⾯是有效的语法,它将使⽤所有DEFAULT 值创建⼀⾏记录。
create table t2(charcol char default 'Y',datecol date default sysdate);
insert into t2 (charcol) values (default);
select * from t2;
C DATECOL
- ---------
Y 28-MAY-04
⼀个常见的问题
⼀个常见的问题是模拟其它数据库提供商的 Autonumber 功能,该功能是使⽤某种顺序数字⾃动地填充某个字段。在 Oracle 数据库中,不能指定⼀个顺序数字作为⼀个字段的 DEFAULT 值;然⽽,可以使⽤触发器模拟这⼀功能。即使⼀个字段声明为 NOT NULL,也依然可以在 INSERT 语句中忽略这个
字段,⽽使⽤⼀个触发器来填充该字段的值。注意使⽤ DEFAULT 关键字⽐使⽤显式的 NULL 可读性要好。
create sequence t3_seq;
create table t3(id$ integer constraint t3_pk primary key);
create or replace trigger t3_autonumber
before insert on t3 for each row
begin
begin
if :new.id$ is null then
select val into :new.id$ from dual;
end if;
end;
/
insert语句字段顺序show errors;
insert into t3(id$) values (default);
select * from t3;
ID$
----------
1
可以使⽤SYS_CONTEXT 值的集合中的默认值来填充字段,并收集有关某处⼀个会话的重要信息:
create table t4
(
when date default SYSDATE,
db_domain varchar2(200) default SYS_CONTEXT('USERENV','DB_DOMAIN'),
host varchar2(256) default SYS_CONTEXT('USERENV','HOST'),
ip_address varchar2(256) default SYS_CONTEXT('USERENV','IP_ADDRESS'),
language varchar2(256) default SYS_CONTEXT('USERENV','LANGUAGE'),
protocol varchar2(200) default SYS_CONTEXT('USERENV','NETWORK_PROTOCOL'),    terminal varchar2(200) default SYS_CONTEXT('USERENV','TERMINAL')
);
);
insert into t4 (when) values (default);
select * from t4;
WHEN
---------
DB_DOMAIN
------------------------------------------------------------------------------
HOST
------------------------------------------------------------------------------
IP_ADDRESS
------------------------------------------------------------------------------
LANGUAGE
------------------------------------------------------------------------------
PROTOCOL
------------------------------------------------------------------------------
TERMINAL
-
-----------------------------------------------------------------------------
28-MAY-04
scott.bn
MSHOME/SCOTT-LAP
AMERICAN_AMERICA.AL32UTF8
SCOTT-LAP
还可以使⽤伪字段SYS_GUID 来填充⼀个字段;它具有全局唯⼀性的优点,并且不需要顺序数字或触发器开销:create table t5(id$ raw(16) default sys_guid()
constraint t5_pk primary key);
insert into t5(id$) values (default);
select * from t5;
ID$
--------------------------------
643718A07DCC43F2AC95312FD43617BA

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。