create table TEST ( ID VARCHAR2(64), A VARCHAR2(3) default ’0’, NAME VARCHAR2(100) ); SQL》 insert into test(a,name) values(null,’test’); 1 row inserted SQL》 select * from test; A NAME test 在膳缦沔的例子中,虽然A列设置了默认值为0,但插入空仍然无效。 其实对于默认值,Oracle撑持两种体例: ? Default关头字 ? 不指定列 先看第一种体例, SQL》 insert into test(a,name) values(default,’test’); 1 row inserted SQL》 select * from test; A NAME 0 test 列A终于有了默认值0。 再看第二种体例, SQL》 insert into test2(name) values(’test’); 1 row inserted SQL》 select * from test2; A NAME 0 test 列A也被添加的默认值。 综上所述,Oracle的默认值措置要留心,如不美观应用中使用的是ORM工具,则必需要考虑对于字段为Null的措置,需要时在ORM工具中将Null转换为default或插入时去失踪值为Null的字段。 可以将下面的系统属性作为默认值: ? SYSDATE:系统时刻 ? SYS_CONTEXT:系统上下文 ? USER:当前数据库用户 ? USERENV:用户情形变量,可以获取一些IP地址、和谈、终端的信息 需要注重,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。 应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未供给自增类型,这就需要我们连系默认值进行二次开发,经由过程默认值实现系统应用的透明。这里连系笔者的经验,供给两种方案: ? 触发器+序列 因为Oracle不撑持在default中使用序列,是以我们只能使用触发器来实现。 create table TEST ( ID VARCHAR2(64), A VARCHAR2(3) default ’0’, NAME VARCHAR2(100) ); create sequence seq_test; create or replace trigger tri_test before insert on test for each row begin if :new.id is null then select seq_test.nextval into :new.id from dual; end if; end; / 这种体例合用于对于ID不要求持续性的场景。 ? Sys_guid()。这个函数返回32位长的数据库全局独一标识。我们可以使用这个函数作为默认值。 alter table TEST modify ID default sys_guid() SQL》 insert into test2(name) values(’张三’); 1 row inserted SQL》 select * from test2; ID A NAME 7CDB1AF556F6474FABA74FA7A60F0822 0 张三 这种体例合用于ID不要求有寄义,以及并发性较高的场景。
|