admin 管理员组文章数量: 1087139
2024年3月12日发(作者:阮一峰 java教程)
oracle约束学习(1)unique和check
有人说,没有索引, 拿什么来保证约束?姑且不论这话的对错,但约束的实现
(除了not null),很多都是通过索引来快速定位约束的地方。unique约束
会自动建立索引,pk也是。也因此,约束的很多问题总是和索引缠绵一起。
相关视图:
dba_constraints
dba_cons_columns
not null约束比较特别点。not null的索引类型和check约束一样,都是C。
只有not null这种约束才会被继承,记住这一点,在复制表时,别忘了加约
束、索引等。
unique 约束
延迟验证属性:deferrable/not deferrable, Deferred/immediate
延迟约束在提交的时候才进行校验,大多数是这样的。
not deferrable:不提交也检查,这是缺省值。
[sql] view plaincopy
1. SQL> select * from hr.t1;
2.
3. ID NAME
4. ---------- ----------------------------------------
5. 1 d
6. 2 b
7.
8. SQL> conn hr/hr
9. 已连接。
10. SQL> alter table t1 add constraint t1_u_1 unique(id); -- 默认情况下是
not deferrable & immediate
11.
12. 表已更改。
13.
14. SQL> insert into t1 values(1,'c');
15. insert into t1 values(1,'c')
16. *
17. 第 1 行出现错误:
18. ORA-00001: 违反唯一约束条件 (HR.T1_U_1)
19.
20.
21. SQL> alter table t1 drop constraint t1_u_1 cascade;
22.
23. 表已更改。
24.
25. SQL> alter table t1 add constraint t1_u_2 unique(id) deferrable; --deferrable & immedi
ate
26.
27. 表已更改。
28. SQL> select * from t1;
29.
30. ID NAME
31. ---------- ----------------------------------------
32. 1 d
33. 2 b
34.
35. SQL> insert into t1 values(1,'c');
36. insert into t1 values(1,'c')
37. *
38. 第 1 行出现错误:
39. ORA-00001: 违反唯一约束条件 (HR.T1_U_2)
为什么延迟还还报错呢?延迟性约束,索引必须非唯一。enable novalidate
也必须是非唯一索引。然而,我们在建unique约束的时候,oracle会隐士的
先创建一个唯一性索引,而且索引的名字和约束的名字是一样的。再来建立
约束,除非这个列本来有一个约束。
[sql] view plaincopy
1. SQL> alter table t1 add constraint t1_u_6 unique(id);
2.
3. 表已更改。
4.
5. SQL> select index_name,uniqueness from user_indexes ;
版权声明:本文标题:oracle约束学习(1)unique和check 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1710221506a563132.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论