创建禁止性约束:

•加disable关键字即可。
SQL> create table t(id int, name char(10));
表已创建。
SQL> desc t
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------------------
 ID                                                 NUMBER(38)
 NAME                                               CHAR(10)
SQL> alter table t add constraint uq_t_id unique(id) disable;
表已更改。
SQL> insert into t values(0,'aaa');
已创建 1 行。
SQL> insert into t values(0,'aaa');
已创建 1 行。
SQL>
SQL> insert into t values(0,'aaa');
已创建 1 行。
SQL> insert into t values(0,'aaa');
已创建 1 行。
SQL> select * from t;
        ID NAME
---------- --------------------------------------------------
         0 aaa
         0 aaa
         0 aaa
         0 aaa
启用约束:
SQL> delete from t;
已删除4行。
SQL> alter table t enable unique;
alter table t enable unique
                          *
ERROR 位于第 1 行:
ORA-00906: missing left parenthesis
SQL> alter table t enable unique(id);
表已更改。
SQL> insert into t values(0,'aaa');
已创建 1 行。
SQL> insert into t values(0,'aaa');
insert into t values(0,'aaa')
*
ERROR 位于第 1 行:
ORA-00001: unique constraint (LUO.UQ_T_ID) violated
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
PK_CUST                        INDEX
T                              TABLE
UQ_EMP_ID                      INDEX
UQ_T_ID                        INDEX
已选择8行。
SQL> drop table t;
表已丢弃。
SQL> create table t(id int, name char(10));
表已创建。
SQL> alter table t add constraint pk_t_id primary key(id) disable;
表已更改。
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
PK_CUST                        INDEX
T                              TABLE
UQ_EMP_ID                      INDEX
已选择7行。
SQL> insert into t values(1,'aaa');
已创建 1 行。
SQL> insert into t values(1,'bbb');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
        ID NAME
---------- --------------------------------------------------
         1 aaa
         1 bbb
SQL> delete from t where name='bbb';
已删除 1 行。
SQL> commit ;
提交完成。
SQL> alter table t enable primary key;                           #启用主键约束可以不用带列名。
表已更改。
SQL> insert into t values(1,'bbb');
insert into t values(1,'bbb')
*
ERROR 位于第 1 行:
ORA-00001: unique constraint (LUO.PK_T_ID) violated
SQL> insert into t values(2,'bbb');
已创建 1 行。
SQL> commit ;
提交完成。
SQL> select * from t;
        ID NAME
---------- --------------------------------------------------
         1 aaa
         2 bbb
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
PK_CUST                        INDEX
PK_T_ID                        INDEX
T                              TABLE
UQ_EMP_ID                      INDEX
已选择8行。
SQL> alter table t disable primary key;                          #再次禁用。
表已更改。
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
DINGDAN                        TABLE
ORDERS                         TABLE
PK_CUST                        INDEX
T                              TABLE
UQ_EMP_ID                      INDEX
已选择7行。                                    #索引消失。
删除约束:
Alter table bonus drop constraint ck_bonus;
删除unique或主键约束时,如果是被引用为外键的则带上cascade参数,删除unique约束同时删除了子表的外键约束。
Alter table bonus drop primary key cascade;
实验:
SQL> select constraint_name,status,validated from user_constraints;
CONSTRAINT_NAME                STATUS           VALIDATED
------------------------------ ---------------- --------------------------
SYS_C002763                    ENABLED          VALIDATED
CK_BONUS                       ENABLED          VALIDATED
CK_BONUS2                      ENABLED          VALIDATED
UQ_EMP_ID                      ENABLED          VALIDATED
PK_CUST                        ENABLED          VALIDATED
FK_CUST                        ENABLED          VALIDATED
CK_DPTID                       ENABLED          VALIDATED
已选择7行。
SQL> alter table bonus drop constraint ck_bonus2;
表已更改。
SQL> select constraint_name,status,validated from user_constraints;
CONSTRAINT_NAME                STATUS           VALIDATED
------------------------------ ---------------- --------------------------
SYS_C002763                    ENABLED          VALIDATED
CK_BONUS                       ENABLED          VALIDATED
UQ_EMP_ID                      ENABLED          VALIDATED
PK_CUST                        ENABLED          VALIDATED
FK_CUST                        ENABLED          VALIDATED
CK_DPTID                       ENABLED          VALIDATED
已选择6行。
SQL> alter table customers drop primary key cascade;
表已更改。
SQL> select constraint_name,status,validated from user_constraints;
CONSTRAINT_NAME                STATUS           VALIDATED
------------------------------ ---------------- --------------------------
SYS_C002763                    ENABLED          VALIDATED
CK_BONUS                       ENABLED          VALIDATED
UQ_EMP_ID                      ENABLED          VALIDATED
CK_DPTID                       ENABLED          VALIDATED
约束状态:

图5
可以启用(ENABLE) 或禁用(DISABLE) 完整性约束。如果启用某个约束,则在数据库中输入或更新数据时,就会对数据进行检查。禁止输入不符合约束规则的数据。如果禁用某个约束,则可以在数据库中输入不符合约束规则的数据。完整性约束可处于以下状态之一:
• DISABLE NOVALIDATE
• DISABLE VALIDATE
• ENABLE NOVALIDATE
• ENABLE VALIDATE
DISABLE NOVALIDATE:不检查处于DISABLE NOVALIDATE 状态的约束。表中的数据(包括输入或更新的新数据)可以不符合约束所定义的规则。
DISABLE VALIDATE:当约束处于此状态时,不允许对受约束的列进行任何修改。另外,约束上的索引将被删除并且禁用约束。注:如果约束可延迟,则不删除索引。
ENABLE NOVALIDATE:如果约束处于此状态,则不能输入违反约束的新数据。但是,表可能包含无效的数据,即数据违反约束。启用处于NOVALIDATE 状态的约束对正在上载有效OLTP 数据的数据仓库配置是非常有用的。
ENABLE VALIDATE:如果约束处于此状态,则不能将违反约束的行插入到表中。但是,禁用该约束时,可以插入此类行。此类行称为该约束的例外。如果约束处于ENABLE NOVALIDATE 状态,则在禁用约束时输入的数据所引起的违反情况仍然存在。要将约束置于已验证状态,必须更新或删除违反约束的行。
当某一约束由禁用状态更改为ENABLE VALIDATE 时,将锁定表并对表中的所有数据进行一致性检查。这可能会引起DML 操作(如等待数据加载),因此,建议先从禁用状态转为ENABLE NOVALIDATE,然后再转为ENABLE VALIDATE。
这些状态之间的转换须符合以下规则:
• 除非指定NOVALIDATE,否则ENABLE 表示VALIDATE。
• 除非指定VALIDATE,否则DISABLE 表示NOVALIDATE。
• VALIDATE 和NOVALIDATE 没有缺省的ENABLE 和DISABLE 状态。
• 当唯一键或主键从DISABLE 状态转为ENABLE 状态且没有现有索引时,将自动创建唯一索引。(如果索引可延迟,则将存在异常。)与此类似,当唯一键或主键从ENABLE 转为DISABLE 且是使用唯一索引启用时,则删除该唯一索引。
• 当任何约束从NOVALIDATE 状态转为VALIDATE 状态时,必须检查所有的数据。但是,从VALIDATE 转为NOVALIDATE 时,将忽略数据已经过检查这一事实。
• 将单个约束从ENABLE NOVALIDATE 状态转为ENABLE VALIDATE 状态时,并不禁止使用读取、写入或其它DDL 语句。
SQL> select constraint_name,table_name,status,validated from user_constraints;
CONSTRAINT_NAME TABLE_NAME           STATUS           VALIDATED
--------------- -------------------- ---------------- -------------------------
CK_BONUS        BONUS                ENABLED          VALIDATED
UQ_EMP_ID       BONUS                ENABLED          VALIDATED
SQL> desc t
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ---------------------------
 ID                                                 NUMBER(38)
 NAME                                               CHAR(10)
 DPT_ID                                             NUMBER(38)
SQL> alter table t add constraint ck_dptid check(dpt_id>=10) disable;
表已更改。
SQL> insert into t values(1,'aaa ',1);
已创建 1 行。
SQL> insert into t values(2,'bbb',2);
已创建 1 行。
SQL> insert into t values(3,'ccc',3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
        ID NAME                                                   DPT_ID
---------- -------------------------------------------------- ----------
         1 aaa                                                         1
         2 bbb                                                         2
         3 ccc                                                         3
SQL> alter table t enable novalidate constraint ck_dptid;
表已更改。
SQL> select constraint_name,table_name,status,validated from user_constraints;
CONSTRAINT_NAME TABLE_NAME           STATUS           VALIDATED
--------------- -------------------- ---------------- -------------------------
CK_BONUS        BONUS                ENABLED          VALIDATED
UQ_EMP_ID       BONUS                ENABLED          VALIDATED
CK_DPTID        T                    ENABLED          NOT VALIDATED
SQL> insert into t values(3,'ddd',4);
insert into t values(3,'ddd',4)
*
ERROR 位于第 1 行:
ORA-02290: check constraint (LUO.CK_DPTID) violated
SQL> insert into t values(3,'ddd',11);
已创建 1 行。
#启用enable novalidate状态成功。
SQL> alter table t add constraint pk_t_id primary key(id) disable;
表已更改。
SQL> select constraint_name,table_name,status,validated from user_constrai
CONSTRAINT_NAME TABLE_NAME           STATUS           VALIDATED
--------------- -------------------- ---------------- --------------------
CK_BONUS        BONUS                ENABLED          VALIDATED
UQ_EMP_ID       BONUS                ENABLED          VALIDATED
CK_DPTID        T                    ENABLED          NOT VALIDATED
PK_T_ID         T                    DISABLED         NOT VALIDATED
SQL> select * from t;
        ID NAME                                                   DPT_ID
---------- -------------------------------------------------- ----------
         1 aaa                                                         1
         2 bbb                                                         2
         3 ccc                                                         3
         3 ddd                                                        11
SQL> alter table t enable novalidate primary key;
alter table t enable novalidate primary key
*
ERROR 位于第 1 行:
ORA-02437: cannot validate (LUO.PK_T_ID) - primary key violated
#报错的原因是因为启用主键约束后会创建一个非唯一性索引,但表中有重复值,索引创建不成功。解决方法可以删除表中主键列的重复值,或用下面的方法。
SQL> create index t_id on t(id);
索引已创建。
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
BONUS                          TABLE
CUSTOMERS                      TABLE
ORDERS                         TABLE
T                              TABLE
T_ID                           INDEX
UQ_EMP_ID                     INDEX
已选择6行。
SQL> alter table t enable novalidate primary key;
表已更改。
SQL> insert into t values(2,'eee',12);
insert into t values(2,'eee',12)
*
ERROR 位于第 1 行:
ORA-00001: unique constraint (LUO.PK_T_ID) violated
SQL> insert into t values(4,'eee',12);
已创建 1 行。
当有大量数据处理时,一致性约束同索引一样会降低数据库性能。因此,可以按以下方法提高性能。

图6
约束检查时间:

图7
在约束定义完成以后,nondeferred与deferred不能相互转变。
SET CONSTRAINTS 语句用于将特定事务处理的约束设置为DEFERRED 或IMMEDIATE。
可以使用此语句设置约束名称列表或约束的模式。SET CONSTRAINTS 模式将一直持续到事务处理完成或者另一个SET CONSTRAINTS 语句重置模式。SET CONSTRAINTS 语句不允许在触发器内部使用。
ALTER SESSION 语句还包含将约束设置为IMMEDIATE 或DEFERRED 的子句SET CONSTRAINTS。此命令缺省为设置所有(ALL) 可延迟的约束(不能指定约束名称列表)。
ALTER SESSION SET CONSTRAINTS 语句仅适用于当前的会话。
ALTER SESSION
SET CONSTRAINT[S] =
{IMMEDIATE|DEFERRED|DEFAULT}
SET CONSTRAINT | CONSTRAINTS
{constraint |ALL }
{IMMEDIATE|DEFERRED}
实验:
SQL> create table t(id int,name char(10),dpt_id int);
表已创建。
SQL> desc t;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------
 ID                                                 NUMBER(38)
 NAME                                               CHAR(10)
 DPT_ID                                             NUMBER(38)
SQL> alter table t add constraint pk_t_id primary key(id);
表已更改。
SQL> select index_name,uniqueness from user_indexes;
INDEX_NAME                                                   UNIQUENESS
------------------------------------------------------------ -------------
PK_T_ID                                                      UNIQUE
SQL> alter table t drop primary key;
表已更改。
SQL> alter table t add constraint pk_t_id primary key(id) deferrable;
表已更改。
SQL> select index_name,uniqueness from user_indexes;
INDEX_NAME                                                   UNIQUENESS
------------------------------------------------------------ -------------
PK_T_ID                                                      NONUNIQUE
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
PK_T_ID                        INDEX
T                              TABLE
已选择6行。
SQL> alter table t disable primary key;
表已更改。
SQL> select object_name,object_type from user_objects;
OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------------
PK_T_ID                        INDEX
T                              TABLE
已选择6行。
#如果索引是非唯一性索引,在disable主键约束时,不会删除相应索引。
SQL> insert into t values(1,'aaa',1);
已创建 1 行。
SQL> insert into t values(1,'aaa',1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select constraint_name,table_name,status,validated from user_constrai
CONSTRAINT_NAME TABLE_NAME           STATUS           VALIDATED
--------------- -------------------- ---------------- --------------------
PK_T_ID         T                    DISABLED         NOT VALIDATED
SQL> alter table t enable novalidate primary key;
表已更改。
SQL> select constraint_name,table_name,status,validated from user_constrai
CONSTRAINT_NAME TABLE_NAME           STATUS           VALIDATED
--------------- -------------------- ---------------- --------------------
PK_T_ID         T                    ENABLED          NOT VALIDATED
SQL> insert into t values(1,'aaa',1);
insert into t values(1,'aaa',1)
*
ERROR 位于第 1 行:
ORA-00001: unique constraint (LUO.PK_T_ID) violated
SQL> select * from t;
        ID NAME                                                   DPT_ID
---------- -------------------------------------------------- ----------
         1 aaa                                                         1
         1 aaa                                                         1
SQL> set constraints all deferred;
约束条件已设置。
SQL> insert into t values(1,'aaa',1);
已创建 1 行。
SQL> insert into t values(1,'aaa',1);
已创建 1 行。
SQL> insert into t values(1,'aaa',1);
已创建 1 行。
SQL> select * from t;
        ID NAME                                                   DPT_ID
---------- -------------------------------------------------- ----------
         1 aaa                                                         1
         1 aaa                                                         1
         1 aaa                                                         1
         1 aaa                                                         1
         1 aaa                                                         1
SQL> commit;
commit
*
ERROR 位于第 1 行:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (LUO.PK_T_ID) violated

转载于:https://blog.51cto.com/luotaoyang/293804

我的Oracle 9i学习日志(18)-- 维护数据完整性.b相关推荐

  1. 我的Oracle 9i学习日志(11)--重做日志文件及练习

    一.重做日志文件特征:   记录对数据所做的所有更改:提供恢复机制:可以划分成组:至少需要两个组(每个组至少一个成员). 二.结构 联机重做日志文件组: • 一组相同的联机重做日志文件副本称作联机重做 ...

  2. Oracle 9i学习日志(9)--数据字典与动态性能视图及练习

    一.数据字典 不仅是每个Oracle数据库的核心组件之一,也是所有数据库用户重要的信息资源:描述数据与对象的数据:包含只读的表和视图:存储在系统表空间:所有者为sys:由Oracle server维护 ...

  3. oracle 9i 只读模式,我的oracle 9i学习日志(6)--Starting Up and shutting down a Database

    Starting Up a Database 1.NOMOUNT 这个状态下oracle server完成下列任务: a.读取初始化参数文件: b.为SGA分配内存: c.启动后台进程: d.打开al ...

  4. 我的Oracle 9i学习日志(20)-- profile

    配置文件是下列口令和资源限制的指定集合: • 口令过期和失效 • 口令历史记录 • 口令复杂性校验 • 帐户锁定 • CPU 时间 • 输入/输出(I/O) 操作 • 空闲时间 • 连接时间 • 内存 ...

  5. 浅谈Oracle服务器归档日志,oracle服务器运行时管理归档日志文件不管理联机重做日志文件...

    <Oracle数据库管理与维护实战>--2.4 Oracle后台进程结构 本节书摘来自异步社区出版社<Oracle数据库管理与维护实战>一书中的第2章,第2.4节,作者: 何伟 ...

  6. oracle不能访问管理页面,Oracle Grid Control CONSOLE无法打开9i数据库的管理维护页面...

    今天在Solaris平台的测试环境上安装了Oracle Grid control 10.2.0.1,安装及配置完成后,发现在登录9i数据库的tablespace维护页面时,页面处于长时间的等待状况.最 ...

  7. Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复)

    Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复) 网课传送门:https://www.bilibili.com/video/BV1Sw411Z779?p=168& ...

  8. Oracle DBA学习基础篇(一) Oracle体系结构 学习笔记

    这里是我通过Oracle DBA实战这本书学习的 Oracle体系结构,大部分是我对书中的内容做的总结,还有遇到不理解的知识点,通过查询资料做的整合.通过这篇博客希望可以让你对Oracle的一些内部原 ...

  9. Oracle的学习详解

    =============oralce安装=============== 基本位置:Oracle安装在哪一个目录(注意不同版本的区别)  %driver_name%\app\username  目标驱 ...

最新文章

  1. 信息检索技术——布尔检索
  2. ajax post请求怎么传参_ajax用post方法传递参数
  3. Python第三方库的安装,升级以及版本查看
  4. 特斯拉卖保险会比卖车更赚钱吗?
  5. 53 -leetcode 7. 整数反转
  6. 【web前端干货】JavaScript是什么?JavaScript有哪些特点?
  7. html基础—页面框架,前端基础——页面架构
  8. 关于NI美国国家仪器音频分析器使用技巧(4461音频分析仪)
  9. (新东方)背单词,记住这200个词根词缀就够了(我自用)
  10. 八爪鱼抓取html,网页图片采集和抓取方法详解 - 八爪鱼采集器
  11. RecyclerView 刷新Item图片闪烁
  12. 抖音直播带货gmv是什么意思?丨国仁网络资讯
  13. 服务器端编程心得(七)——开源一款即时通讯软件的源码
  14. winform 分页打印实例
  15. 51群接龙-社区社群团购专业营销工具
  16. uniapp 侧边选项卡(左右滚动)
  17. 机器学习笔试题练习(08-04)【4】
  18. 一款简单的Bootstrap和jQuery倒计时插件
  19. Unix/C++--模板
  20. MIPI LCD调试总结

热门文章

  1. 用与非门设计血型配对电路_利用与非门CD4011做一个防盗报警器,那些高大上就这么简单...
  2. Java内部类实例测试及总结
  3. 3.Java 面试题整理(线程篇)
  4. Maven项目设置仓库下载位置
  5. Linux实战 | 使用Xshell连接Linux_2
  6. 复数基础——复数的绝对值,复数的极坐标形式的直观解释练习_8
  7. android权威指南十三章,《Android编程权威指南》第30~32以及第34章读书笔记
  8. 【英语学习】【WOTD】regale 释义/词源/示例
  9. 【英语学习】【WOTD】avuncular 释义/词源/示例
  10. 8086架构/流水线及其优化