Oracle约束状态

第一:

oracle约束的4种状态:

disable novalidate 既不会约束新增数据也不会验证已有数据,等同于disable

enable novalidate 约束新增数据但不会验证已有数据

disable validate 约束新增数据但不会验证已有数据,启用后禁止DML

enable validate 约束新增数据并验证已有数据,等同于enable

测试:

--1.创建一个实验表
CREATE TABLE check_test AS SELECT * FROM scott.emp
--2.查询
select * from check_test;
--3.增加约束
alter table check_test add constraint id_unique unique(empno);
--4.查看现在约束的装状态
select t.owner,t.constraint_name,t.status,t.deferrable,t.deferred,t.validated from user_constraints t where t.constraint_name=‘ID_UNIQUE‘
t.owner,t.constraint_name,t.status, t.deferrable, t.deferred, t.validated
1 TEST ID_UNIQUE ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
看到 status 与 validated分别是 ENABLE VALIDATED
--5.观察到状态后进行插入操作(这条数据位empno已经存在。)
insert into check_test values(7934,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),6000,NULL,10);
结果:ORA-00001: 违反唯一约束条件 (TEST.ID_UNIQUE)
--6.修改状态为:
alter table check_test modify constraint id_unique disable novalidate;
--7.再次执行插入操作。
insert into check_test values(7934,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),6000,NULL,10);
结果:1 row inserted
观察索引会发现之前的唯一索引被自动删除:
select * from user_indexES where index_name=‘ID_UNIQUE‘
--8.再次修改状态
alter table check_test modify constraint id_unique enable novalidate;
结果: ORA-02299: 无法验证 (TEST.ID_UNIQUE) - 找到重复关键字。
原因:因为enable会去创建唯一性索引,而已有数据deptno存在重复数据10,所以这里不能enable
--9.删除重复的。
delete from check_test where empno=7934 and ENAME=‘EVAN‘;
再次执行:alter table check_test modify constraint id_unique enable novalidate;
结果:Table altered;
--10.
select index_name,table_name,uniqueness from dba_indexes where index_name = ‘ID_UNIQUE‘;
再次插入:

insert into check_test values(7934,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),6000,NULL,10);
结果:ORA-00001: 违反唯一约束条件 (TEST.ID_UNIQUE)
--11.再次改变状态
alter table check_test modify constraint id_unique disable validate;
再次插入数据:结果:ORA-25128: 不能对带有禁用和验证约束条件 (TEST.ID_UNIQUE) 的表进行插入/更新/删除

--12.新增一个约束
alter table check_test add constraint check_sal check(sal between 0 and 7000);
--12修改新约束check_sal状态
alter table check_test modify constraint check_sal disable novalidate;
插入数据
insert into check_test values(7776,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),8000,NULL,10);
commit;
alter table check_test modify constraint check_sal enable novalidate;
insert into check_test values(7777,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),8000,NULL,10);
结果:ORA-02290: 违反检查约束条件 (TEST.CHECK_SAL)
alter table check_test modify constraint check_sal enable validate;
结果:ORA-02293: 无法验证 (TEST.CHECK_SAL) - 违反检查约束条件

第二:

约束延迟验证相关内容:

Deferrable Constraints

Every constraint is either in a not deferrable (default) or deferrable state. This state determines when Oracle Database checks the constraint for validity. The following graphic depicts the options for deferrable constraints

If a constraint is not deferrable, then Oracle Database never defers the validity check of the constraint to the end of the transaction. Instead, the database checks the constraint at the end of each statement. If the constraint is violated, then the statement rolls back

You can set the default behavior for when the database checks the deferrable constraint. You can specify either of the following attributes:

  • INITIALLY IMMEDIATE

    The database checks the constraint immediately after each statement executes. If the constraint is violated, then the database rolls back the statement.

  • INITIALLY DEFERRED

    The database checks the constraint when a COMMIT is issued. If the constraint is violated, then the database rolls back the transaction

测试:

--1.
select t.owner,t.constraint_name,t.deferrable,t.deferred from user_constraints t where t.constraint_name=‘CHECK_SAL‘
结果:

OWNER CONSTRAINT_NAME DEFERRABLE DEFERRED
------------------------------------------------------------ ------------------------------ -------------- ---------
TEST CHECK_SAL NOT DEFERRABLE IMMEDIATE

此约束为不能延迟

--2.重建约束check_sal
alter table check_test drop constraint CHECK_SAL;
Table altered
alter table check_test add constraint CHECK_SAL check(sal between 1 and 7000) deferrable;
Table altered
--3.再次查询:
select t.owner,t.constraint_name,t.deferrable,t.deferred from user_constraints t where t.constraint_name=‘CHECK_SAL‘
结果:
OWNER CONSTRAINT_NAME DEFERRABLE DEFERRED
------------------------------------------------------------ ------------------------------ -------------- ---------
TEST CHECK_SAL DEFERRABLE IMMEDIATE
--4.执行插入
insert into check_test values(7776,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),8000,NULL,10);
结果:ORA-02290: 违反检查约束条件 (TEST.CHECK_SAL)
--5.修改约束状态:
set constraint check_sal DEFERRED;
Constraints set
再次插入数据: insert into check_test values(7776,‘EVAN‘,‘CLERK‘,7782,to_date(‘1989/8/22‘,‘YYYY-MM-DD‘),8000,NULL,10);
结果:1 row inserted

提交:commit;
结果:
ORA-02091: 事务处理已回退
ORA-02290: 违反检查约束条件 (TEST.CHECK_SAL)

时间: 2024-10-10 07:46:13

Oracle约束状态的相关文章

Oracle约束的状态及验证机制

一.Oracle约束的状态 Oracle完整性约束的状态有4种,分别是ENABLE.DISABLE.VALIDATE.NOVALIDATE. ENABLE          表示Oracle将检查要插入或更新的数据库中的数据是否符合约束: DISABLE         表示表中可以存放违反约束的行: VALIDATE       表示数据库验证表中的已存在数据是否符合约束: NOVALIDATE  表示数据库不验证表中已存在数据是否符合约束. Oracle默认约束状态为ENABLE.VALID

[Oracle]约束(constraint)

(一)约束的概念 在Oracle中,可以通过设置约束来防止无效数据进入表中.Oracle一共有5种约束: 主键约束(primary key) 外键约束(foreign key) 唯一性约束(unique) 非空约束(not null) 检查约束(check) (1)主键约束 --主键约束可以定义在一列或多列上,值具有唯一性.非空性: --在一个表上只能定义一个主键约束: --Oracle会自定在主键约束的列上创建唯一性索引,可以指定唯一性索引的位置及存储参数. (2)外键约束 --外键约束列的取

转 ORACLE约束总结

https://www.cnblogs.com/kerrycode/archive/2012/05/13/2454614.html 你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本ORACLE是否不同)?视图有约束吗?约束是否会影响SQL性能? 约束信息存储在哪些系统视图.数据字典中?约束能否修改名称?能否禁用约束?延迟约束有啥好处.......

oracle 约束

一.维护数据的完整性 概述:数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则.在Oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选. 1.约束 约束用于确保数据库数据满足特定的商业规则.在Oracle中,约束包括:not null.unique.primary key, foreign key和check五种. A.not null(非空) 如果在列上定义了not null

Oracle约束详解

一 约束的定义 约束是强加在表上的规则或条件.确保数据库满足业务规则.保证数据的完整性.当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作.约束可以是列一级别的 也可以是表级别的.定义约束时没有给出约束的名字,ORACLE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称.) 在ORACLE中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来实现,在这三种方

oracle 用户状态查询

#切换到Oracle用户su - oracle #登录sqlplussqlplus / as sysdba #设置显示格式set pagesize 300;set linesize 300; #查询用户列表及用户状态select USERNAME,password,ACCOUNT_STATUS from dba_users; #查看用户分配的权限 select * from dba_role_privs order by GRANTEE; select * from dba_role_privs

oracle约束条件状态

Oracle完整性约束有一下4种: • DISABLE NOVALIDATE • ENABLE NOVALIDATE • DISABLE VALIDATE • ENABLE VALIDATE • DISABLE NOVALIDATE 对原有和新数据都不校验. 适用只读表,提升性能. 当数据来自验证过的源,而且表是只读表时,通常会使用此状态.因此,不会将新数据输入表中.在已清理了数据的数据仓库环境中使用NOVALIDATE.此时不需要进行验证,因而可以节省很多时间. • ENABLE NOVALI

十五、oracle 约束

一.维护数据的完整性数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则,在oracle中,数据完整性可以使用约束.触发器.应用程序(过程.函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选. 二.约束约束用于确保数据库数据满足特定的商业规则.在oracle中,约束包括:not null. unique, primary key, foreign key和check 五种.1).not null(非空)如果在列上定义了not null,那么

Oracle数据库状态

状态查询 实验过程 SQL> startup nomount; ORACLE instance started. Total System Global Area 125829120 bytes Fixed Size 1247684 bytes Variable Size 92276284 bytes Database Buffers 25165824 bytes Redo Buffers 7139328 bytes SQL> select status from v$instance; ST