有人说,没有索引, 拿什么来保证约束?姑且不论这话的对错,但约束的实现(除了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 b

SQL> 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 b

SQL> 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 b

SQL> 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 UNIQUE

SQL> 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 b

SQL> 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 c

SQL> 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 c

SQL> 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 c

SQL> 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 c

SQL> 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

----------

5

SQL> 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银行卡号检查约束,oracle约束学习(1)unique和check相关推荐

  1. oracle如何检查rman,oracle RMAN检查命令

    1.crosscheck 校验备份文件与备份元数据信息之间的一致性: RMAN> crosscheck; RMAN-00571: ================================ ...

  2. oracle cdc 提交顺序,Oracle CDC部署流程

    一.ORACLE环境检查 查oracle数据库版本(>9.2.0.4.0). select * from v$version; BANNER Oracle Database 10g Enterp ...

  3. oracle 日期检查,在检查约束中使用日期,Oracle

    我试图检查添加以下约束,但Oracle返回如下所示的错误. ALTER TABLE Table1 ADD (CONSTRAINT GT_Table1_CloseDate CHECK (CloseDat ...

  4. oracle去除检查非空,oracle 主键,非空,检查,唯一,默认,外键约束

    --首先添加主键约束 alter table student add constraint PK_student_sno primary key(sno) --删除约束 alter table stu ...

  5. oracle 约束 Oracle 10g学习系列(5)

    这篇文章来自网络,写的挺好,转过来了.  维护数据的完整性 概述:数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则.在Oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方 ...

  6. oracle字段加约束,Oracle数据库的字段约束创建和维护示例

    创建Oracle数据库的字段约束: 非空约束 唯一约束 对字段的取值的约束 默认值 外键约束 create table tab_class( class_id number primary key, ...

  7. oracle 怎么创建约束,Oracle创建约束

    约束的类型: oracle数据库支持的约束类型包括: 1.unique 2.not null 3.primary key 4.foreignkey 5.check 约束都有名称.如果没有显示地给它们命 ...

  8. oracle 唯一索引,唯一约束,主键之间的联系

    主键(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录,在两个表的关系中,主键用来在一个表中引用来自于另一个表中的特定记录,,主键时一种唯一关键字,表定义的一部分. ...

  9. Oracle视图添加约束,Oracle创建视图的语法

    Oracle创建视图的语法 导读:就爱阅读网友为大家分享了多篇关于 "oracle 创建序列语法" 资料,内容精辟独到,非常感谢网友的分享,希望从中能找到对您有所帮助的内容. 相关 ...

最新文章

  1. MySQL(MariaDB)常用DOM命令
  2. python文件传输模块_如何将python对象从一个文件模块传递到另一个文件模块?
  3. 细数sass安装中遇到的坑
  4. mysql开源内库_MySQL数据库(查询语句)
  5. mysql学生成绩视图_mysql的视图
  6. 极简代码(三)—— 欧式距离
  7. python数据分析-《Python数据分析与数据化运营》电子版
  8. Python 从协议到抽象基类
  9. vue实例中使用swiper
  10. 20170923在线编程之输入年、月、日输出这是一年的第几天
  11. linux中怎么粘贴复制文件路径,如何在Linux中复制文件和目录
  12. 一起领略css3动画的强大
  13. C++编程-leetcode-19-删除链表的倒数第N个结点
  14. 使用vscode编辑vue模板
  15. 移动端特点(重点)~~~
  16. 计算机网络课题目,计算机网络课程学论文选题 计算机网络课程论文题目怎么取...
  17. 解决傻妞掉线、装死等系列问题,screen守护永不掉线
  18. 【使用指南】清华源的使用
  19. ubuntu 自动挂起_ubuntu 的挂起与休眠
  20. Struts2-----面试题汇总

热门文章

  1. 现在使用控件, 更喜欢继承(覆盖控件已有的函数,很奇怪的一种使用方式)...
  2. 聊聊这两年我用到的面试套路和收获
  3. Page.ClientScript.RegisterStartupScript函数的使用
  4. 一到关于js函数的前端面试题引发的血案
  5. C#(WinForm)的Show()和ShowDialog()方法介绍
  6. C++语言程序设计视频教程_清华大学_郑莉(基础篇+进阶篇)
  7. 中国工程院2019年院士增选第二轮候选人名单公布 李彦宏落选
  8. VC++ MFC DLL动态链接库编写详解
  9. can差分线阻抗_CAN总线冷知识—边沿台阶是怎么来的?
  10. java nio单线程6_Java NIO6:选择器2---代码篇