create table TEST- U8 \" N: q& O+ @6 {
(6 U* b/ l. ^# C+ M O: Q
ID VARCHAR2(64)," w/ Q" e) f7 d! g, d( c6 W3 o
A VARCHAR2(3) default ’0’,- W' g) C1 C) g7 F, K1 G6 x. j% n3 y
NAME VARCHAR2(100)
- X# V7 i5 s% |' x+ k: q: @9 V4 P );
1 o; |7 d) ?4 h' A& W SQL> insert into test(a,name) values(null,’test’);
- M Y9 l6 a- ~ Q* w7 f 1 row inserted
0 m8 m6 z% J6 Y8 _6 h, ?) C( w3 W9 k SQL> select * from test;
5 V0 E3 U; } V4 P7 n, \+ B/ a A NAME/ ^% b* T7 i) x3 U
test+ r. I4 g h: T7 n( u
在膳缦沔的例子中,虽然A列设置了默认值为0,但插入空仍然无效。9 {, J0 U% s+ O: u
其实对于默认值,Oracle撑持两种体例:
% Q0 r' a$ S5 D ? Default关头字" b5 q2 L% `' |. D$ q
? 不指定列
2 N4 j4 [# L! Q$ A; p/ z 先看第一种体例,$ H" l: d8 H6 P! B, H* K
SQL> insert into test(a,name) values(default,’test’);2 q! {2 ]! \) C, D: s) D+ |
1 row inserted/ c# T0 O4 B0 X( F/ t
SQL> select * from test;
( ?9 f6 M, C5 G A NAME( r2 M' a/ m/ V Z
0 test
' U8 ]5 i! L- o7 ^$ M 列A终于有了默认值0。" g ?1 d+ g# {! C) ~( [
再看第二种体例,
2 b; S1 M- [7 _$ @& W+ L SQL> insert into test2(name) values(’test’);" W7 t2 M! n; `1 I3 ?
1 row inserted0 r4 `7 L/ K9 n5 E. j! i+ j% L
SQL> select * from test2;% C; Y" @( {' e$ U3 F; M# b
A NAME6 {* h# u, u5 Q- v5 ]& U
0 test( P/ a" N# k8 Z5 k& S! D
列A也被添加的默认值。
- y/ b% }! n+ L' D9 T 综上所述,Oracle的默认值措置要留心,如不美观应用中使用的是ORM工具,则必需要考虑对于字段为Null的措置,需要时在ORM工具中将Null转换为default或插入时去失踪值为Null的字段。
/ \" _$ u1 L' f9 k 可以将下面的系统属性作为默认值:
6 S/ ?8 I5 l8 e" l4 [/ J3 B; {8 f( w ? SYSDATE:系统时刻9 x; P) j, u, v9 C# X' M! ?4 ?
? SYS_CONTEXT:系统上下文
, o- p& |! v* I! A ? USER:当前数据库用户9 G; \/ |/ L7 k y7 @$ j* }
? USERENV:用户情形变量,可以获取一些IP地址、和谈、终端的信息! d/ n% c, t* t' x) H
需要注重,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。- e4 z$ b; p2 _; R$ G0 g
应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未供给自增类型,这就需要我们连系默认值进行二次开发,经由过程默认值实现系统应用的透明。这里连系笔者的经验,供给两种方案:
3 e4 K; e* k, ^" e+ u ? 触发器+序列' y: T1 Q* k/ ~- P6 h) `+ i. I1 O
因为Oracle不撑持在default中使用序列,是以我们只能使用触发器来实现。
2 K# w2 t# }$ I3 ]7 R) |: o4 A7 F- }6 _* s create table TEST
2 e0 p" ^( m0 _7 j/ l (1 z7 ?0 h5 V+ h6 S8 |4 V: Q
ID VARCHAR2(64),
! K, d; F7 e, J/ c A VARCHAR2(3) default ’0’,
. I/ ?% D- G0 n NAME VARCHAR2(100) c! K8 n3 b8 D# P6 {2 o
);( b% U4 P4 Q* b6 a$ ]4 D4 }* W
create sequence seq_test;" x8 @. U( Z* V8 A# U
create or replace trigger tri_test# j- e' i! |) e* ~* [. N
before insert on test for each row
1 W. _# \8 g% D" W; X; J- U. {) x begin2 |- H( p! w) C
if :new.id is null then
, j/ x/ {' q) |/ M select seq_test.nextval into :new.id from dual;
% S6 d# q3 U* S end if;. C5 G0 H, p% q: k. f! k. O
end;- a6 ^: V \+ L
/
- g& b9 A, Q" T2 Z 这种体例合用于对于ID不要求持续性的场景。
2 B: q; a. @ y8 m( S ? Sys_guid()。这个函数返回32位长的数据库全局独一标识。我们可以使用这个函数作为默认值。
! K1 ?, _9 y: T; b0 ] alter table TEST modify ID default sys_guid()
, Z1 ?. z' }* ]' c O SQL> insert into test2(name) values(’张三’);
! M0 l7 J* l3 j 1 row inserted
$ l( n# F- F2 {, o/ K SQL> select * from test2;
" x: ?' s- `. T( `! z# i ID A NAME3 _ t D# v9 E" \8 a
7CDB1AF556F6474FABA74FA7A60F0822 0 张三
8 S9 p( c& U) w) c9 { 这种体例合用于ID不要求有寄义,以及并发性较高的场景。 |