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 ;


本文标签: 约束 时候 延迟 提交 名字