[Oracle]对数据库字段使用默认值
2006-02-15 09:02
746 查看
在创建数据库表时,你可以指定一个 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
可以在以后某个时候通过一条 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 |
相关文章推荐
- hibernate 如何使用oracle 数据库 默认值(sysdate)
- 在Hibernate中使用数据库字段默认值的配置
- oracle 使用sql获取数据库表,表的字段
- oracle 使用sql获取数据库表,表的字段
- 在oracle 数据库中使用 Blob 字段存储 一张图片并读取
- oracle 使用sql获取数据库表,表的字段
- 使用SSH在做插入和修改的时候即使数据库中给字段设置了默认值还是没有用,在表对应的配置文件中也不知道该如何配置。。请教下。。
- oracle 使用sql获取数据库表,表的字段
- oracle 使用sql获取数据库表、表的字段的多种方法
- 使用SQL Script更改数据库中字段的默认值
- 数据库字段设计时是使用默认值,还是NULL
- oracle 使用sql获取数据库表、表的字段的多种方法
- Oracle 数据库里查看表空间使用状况
- 在 Oracle 数据库上使用 Visual Studio 2005 或 2008 构建 .NET 应用程序
- 本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
- mysql 数据库字段为datetime类型时默认值为:0000-00-00 00:00:00 查询时异常 java.sql.SQLException:Value '0000-00-00' can not be represented as java.sq
- 在Oracle+NHibernate环境下使用Guid字段
- Oracle中 关于数据库存储过程和存储函数的使用
- X86_64平台下Oracle 11g R2 X64 for Linux的软件安装、数据库安装、服务配置、数据库启动和停止、SQLPLus使用
- Oracle编程之使用其他表的字段类型作为变量的类型