a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 60|回复: 0

[综合] Oracle辅导:Oracle列的Default属性

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
  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不要求有寄义,以及并发性较高的场景。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 12:12 , Processed in 0.186584 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表