Oracle中預設值default的使用方法

來源:互聯網
上載者:User

在建立資料庫表時,你可以指定一個 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
    if :new.id$ is null then
        select t3_seq.nextval into :new.id$ from dual;
    end if;
end;
/
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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.