常用的数据字典 / }' h* I, m* q) _
dba_constraints , C! B; m1 A$ J3 {, @/ F3 E, k
dba_cons_columns 0 i+ f. r' s; C, y3 d$ J
user_cons_columns 0 @' r3 a3 p# Z
user_constraints
9 @/ z& l# r% A1 w8 I2 M* S! w( B, @4 B
简单应用
0 k* o# m9 ^- u9 ]( }" B 检验当为一个表建立主键索时后,这个字段是否满足约束非空,唯一性,而且自动建立一个索引,并查看当把约束状态关闭再次插入相同的记录,是否还能把把约束设为enable ividate状态。 ) k5 f. c# ?" Y3 q& f6 T2 k
2 G2 g' X$ u) G9 I
SQL> create table t(i number constraint pk_i primary key,v number);
+ Z! t* ^ A5 H4 r& f8 A SQL> insert into t values(1,2);
/ K9 i9 ]$ E2 g! i- z0 ^# W' t SQL> insert into t values(3,4);
, ^, P7 d. Z! _ }) f; p SQL> commit; 3 H0 _# a* {" \% ?
SQL> select * from t;
. q; A- f, `3 k& T, n I V ; V4 d* n+ h5 O, q4 q" _: A$ ~
---------- --------------------------- " ~$ S& k8 j2 T0 K* m
1 2
* N9 A* `; I0 ^5 Z2 ] 3 4
1 _2 ? ?: G& B/ P 现在表中有两条记录,然后给它插主键为空或相同的值
" D& g' ?# [5 }$ T9 ]& W+ ] SQL> insert into t values(’’,10);
+ b2 P3 {& ^" k; I. F5 ] ERROR at line 1:
: ]* U+ @8 b- L \ w8 r ORA-01400: cannot insert NULL into ("Y"."T"."I") : y/ {. t7 f. B* u" l
SQL> insert into t values(1,10);
7 a; V8 |1 v: o ERROR at line 1:
! F0 t9 G/ g- g: m( j" ?% | ORA-00001: unique constraint (Y.PK_I) violated " {/ @/ _) `% P/ v* o
可以看到全部报错,此时主键不能为空或重复 ! C, O& j( _* M- d% k& _% [
查看是否建立索引 / G, k- ~5 Y8 p% r& k
SQL> select index_name from user_indexes;
) [( U$ t4 n* K9 W" l. g) U# ]% | S INDEX_NAME
. V9 o9 S! @4 s+ [1 R) | ------------------------------
! ]' Z" ^( q5 K6 j PK_I
s4 q% Q2 m4 Y& j! r9 P- I( G. L 把约束关闭再次做同样的操用
0 D$ p# O7 h% j; d' V SQL> alter table t disable novalidate constraint pk_i;
- G' E2 ~0 L3 n2 Q6 } Table altered.
' Q- a7 F+ `- o) s SQL> insert into t values(’’,10);
. |6 ^) p. E5 A- M1 n6 ]* b9 g 1 row created. , _$ b8 a) u' \/ f! F& x8 M8 N
SQL> insert into t values(1,10);
6 i) K, q! j( Y7 I! @. k 1 row created. 7 y) S, r; O9 \8 F- X/ Q
SQL> commit;
% x0 P9 J$ l# G* d2 [ Commit complete.
( d/ s! A/ L; v: `" i SQL> select * from t; 7 C j; s+ i$ K( u- O
I V
7 ^, V- _! F; U7 q ---------- ----------
& D* q; J; q$ j$ D% _3 |: w9 [! s 1 2
3 ?0 x+ C0 W' o2 z, x1 h6 C 3 4
2 U7 T8 O" [/ n' Y. A) h: ` 10
4 m% Y5 E. [* @% p' P 110 ) M9 @9 C3 Z$ Y) h/ F
SQL> select index_name from user_indexes;
+ z- Q* ~0 M5 T: z% K no rows selected % |4 `* \3 V0 q7 p- {
可见当把约束关闭后就可以何意给表插数据了,而具索引也自动删除了。 + |1 }6 s8 G/ @& i# z" j5 ?0 p) r
现在激活约束
1 V) j* `% }; W' g4 t SQL> alter table t enable validate constraint pk_i;
3 F" B9 ^" B0 {1 k* b alter table t enable validate constraint pk_i ) L7 Z8 j2 E* _, Y- o: j, h
ERROR at line 1:
: ^3 P n B8 J, w2 m ORA-02437: cannot validate (SYS.PK_I) - primary key violated : z# O1 F6 t* V# w% @4 L
因为表中主键有相同的值所以不能恢复到enable validate状态了 * ~9 g4 L- z2 R$ A2 I h8 X
再次测试回复到enable novalidate ; k0 I5 z% M- M- @
SQL> alter table t enable novalidate constraint pk_i;
$ q5 R( C4 u; T! i' G: L4 S. p, K alter table t enable validate constraint pk_i 3 j8 [* v0 E G$ S
ERROR at line 1: 6 ] O7 |3 j0 h8 b6 `
ORA-02437: cannot validate (SYS.PK_I) - primary key violated
, ^& W" \( A* T4 q x _ 也失败了,
6 W( `- O3 |- n% U, I 因为表中主键有了空值和相同的值,所以恢复不到enable validate状态,但enable novalidate不检查旧数据所以应该还能恢复到enable novalidate. 5 J; d8 k% l3 G) \, v) D$ ]# a
$ `/ F; _% m+ | N7 l
要想恢复到enable novalidate必须建立主键索引(关闭约束时自动删除的那个索引)如下: ( k- U5 V, H& @3 w \
SQL> create index pk_i on t(i); ( N! s( C9 r* b/ |" a
Index created.
2 Y) g! U; W% Z" _8 W5 Z 然后恢复到enable disvalidate,以后再插数据不能为空,主键也不能重复了. / s* C2 t) `. p
SQL> alter table t enable novalidate constraint pk_i;
: r4 L4 r/ L" _6 Q+ v7 |: y4 Q* y8 V# I Table altered.
4 d2 k# ] i* J5 }+ Z# { SQL> insert into t values(1,14);
' x' g1 R5 N, ~0 v6 a. R insert into t values(1,14) 7 b3 g/ a! C: b1 [+ s8 u
ERROR at line 1:
# P# J/ C+ k6 [4 t' H9 t m ORA-00001: unique constraint (SYS.PK_I) violated |