oracle约束学习(1)unique和check
来源:互联网 发布:淘宝天猫商城话费充值 编辑:程序博客网 时间:2024/06/04 19:44
有人说,没有索引, 拿什么来保证约束?姑且不论这话的对错,但约束的实现(除了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> select * from hr.t1; ID NAME---------- ---------------------------------------- 1 d 2 bSQL> conn hr/hr已连接。SQL> alter table t1 add constraint t1_u_1 unique(id); -- 默认情况下是not deferrable & immediate表已更改。SQL> insert into t1 values(1,'c');insert into t1 values(1,'c')*第 1 行出现错误:ORA-00001: 违反唯一约束条件 (HR.T1_U_1)SQL> alter table t1 drop constraint t1_u_1 cascade;表已更改。SQL> alter table t1 add constraint t1_u_2 unique(id) deferrable; --deferrable & immediate表已更改。SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 bSQL> insert into t1 values(1,'c');insert into t1 values(1,'c')*第 1 行出现错误:ORA-00001: 违反唯一约束条件 (HR.T1_U_2)
为什么延迟还还报错呢?延迟性约束,索引必须非唯一。enable novalidate也必须是非唯一索引。然而,我们在建unique约束的时候,oracle会隐士的先创建一个唯一性索引,而且索引的名字和约束的名字是一样的。再来建立约束,除非这个列本来有一个约束。
SQL> alter table t1 add constraint t1_u_6 unique(id);表已更改。SQL> select index_name,uniqueness from user_indexes ;INDEX_NAME UNIQUENESS------------------------------------------------------------ ------------------T1_U_6 UNIQUE
SQL> alter table t1 add constraint t1_u_3 unique(id) deferrable; --deferrable & immediate表已更改。SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 bSQL> insert into t1 values(1,'c');insert into t1 values(1,'c')*第 1 行出现错误:ORA-00001: 违反唯一约束条件 (HR.T1_U_3)SQL> alter table t1 drop constraint t1_u_3 cascade;表已更改。SQL> drop index t1_index;索引已删除。SQL> create unique index t1_index on t1(id);索引已创建。SQL> select index_name,uniqueness from user_indexes;INDEX_NAME UNIQUENESS------------------------------------------------------------ ------------------T1_INDEX UNIQUESQL> alter table t1 add constraint t1_u_4 unique(id) deferrable;alter table t1 add constraint t1_u_4 unique(id) deferrable*第 1 行出现错误:ORA-01408: 此列列表已索引SQL> drop index t1_index;索引已删除。SQL> alter table t1 drop constraint t1_u_4 cascade;alter table t1 drop constraint t1_u_4 cascade *第 1 行出现错误:ORA-02443: 无法删除约束条件 - 不存在的约束条件SQL> alter table t1 add constraint t1_u_5 unique(id) initially deferred deferrable; --若是not deferrable,则只能跟immediate表已更改。SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 bSQL> insert into t1 values(1,'c');已创建 1 行。SQL> insert into t1 values(1,'d');已创建 1 行。SQL> commit;commit*第 1 行出现错误:ORA-02091: 事务处理已回退ORA-00001: 违反唯一约束条件 (HR.T1_U_5)
immediate deferrable是立马延迟,而deferred deferrable则是在commit时给回滚掉。
check
validate会检查旧值,而novalidate不会。这个运用可以用来避免前台小姐误操作。
SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 b 3 c 4 cSQL> alter table t1 add constraint t1_u_6 check(id>10) validate;alter table t1 add constraint t1_u_6 check(id>10) validate *第 1 行出现错误:ORA-02293: 无法验证 (HR.T1_U_6) - 违反检查约束条件SQL> alter table t1 add constraint t1_u_6 check(id>10) novalidate;表已更改。SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 b 3 c 4 cSQL> insert into t1 values(5,'d');insert into t1 values(5,'d')*第 1 行出现错误:ORA-02290: 违反检查约束条件 (HR.T1_U_6)SQL> alter table t1 add constraint t1_u_6 check(id>10) enable novalidate;表已更改。SQL> insert into t1 values(6,'d');insert into t1 values(6,'d')*第 1 行出现错误:ORA-02290: 违反检查约束条件 (HR.T1_U_6)SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 b 3 c 4 cSQL> alter table t1 add constraint t1_u_6 check(id>10) disable novalidate;表已更改。SQL> select * from t1; ID NAME---------- ---------------------------------------- 1 d 2 b 3 c 4 cSQL> insert into t1 values(5,'s');已创建 1 行。SQL> commit;提交完成。
约束的优先级比约束的属性来得高。
SQL> create table t1 (id number,constraint t1_u_6 check(id>3) validate);表已创建。SQL> insert into t1 values(1);insert into t1 values(1)*第 1 行出现错误:ORA-02290: 违反检查约束条件 (HR.T1_U_6)SQL> insert into t1 values(5);已创建 1 行。SQL> drop table t1 purge;表已删除。SQL> create table t1(id number,constraint t1_u_6 check(id>3) novalidate);表已创建。SQL> insert into t1 values(1);insert into t1 values(1)*第 1 行出现错误:ORA-02290: 违反检查约束条件 (HR.T1_U_6)SQL> insert into t1 values(5);已创建 1 行。SQL> select * from t1; ID---------- 5SQL> alter table t1 add constraint t1_u_6 check(id>10) novalidate;表已更改。SQL> insert into t1 values(3);insert into t1 values(3)*第 1 行出现错误:ORA-02290: 违反检查约束条件 (HR.T1_U_6)SQL> insert into t1 values(7);insert into t1 values(7)*第 1 行出现错误:ORA-02290: 违反检查约束条件 (HR.T1_U_6)SQL> insert into t1 values(11);已创建 1 行。SQL> select * from t1; ID---------- 5 11
- oracle约束学习(1)unique和check
- SQL 数据库 学习 010 表和约束的区别、check约束、default约束、unique约束、not null约束
- oracle约束总结(not null/unique/primary key/foreign key/check)
- oracle中五中约束详解(CHECK,UNIQUE,PRIMARY KEY,FOREIGN KEY,NOT NULL)
- Oracle中如何创建约束,查询约束和删除约束(check约束,外键和主键约束)
- sql CHECK ,UNIQUE 约束(mysql)
- Oracle check 约束
- oracle的check约束
- Oracle-16-check约束
- Oracle 中 check约束
- SQLServer中有五种约束,Primary Key约束、Foreign Key约束、Unique约束、Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的
- oracle的unique约束
- oracle的完整性约束:check/not null/unique/primary/foreign key
- SQLite学习笔记六: 约束NOT NULL,DEFAULT,UNIQUE,PRIMARY KEY, CHECK
- Oracle学习笔记(四)——Primary Key&Unique约束
- UNIQUE约束和主键
- SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)
- check约束(备忘录)
- 鼻祖:查询意图分类 (query分类)
- Android应用开发---关于SQL中通过cursor获取指定id的内容
- redhat Linux系统 chmod对于文件和目录的权限区别
- Web搜索中的用户意图的自动识别
- 长尾效应_初级篇
- oracle约束学习(1)unique和check
- Ubuntu下如何修改文件或者文件夹的权限
- 长尾效应感性认识
- USACO 4.2.1 Ditch 网络最大流问题算法小结
- hdu 4359 Easy Tree DP?
- 编程之美1.9 扩展问题2
- 搜索引擎的查询意图识别(query理解)
- DP动态规划——hdu 1008 Common Subsequence(最长公共子序列)
- 刻不容缓,大势所趋