[20120824]oracle中的 CONSTRAINT 属性ENABLE DISABLE VALIDATE NOVALIDATE.txt

[20120824]oracle中的 CONSTRAINT 属性ENABLE DISABLE VALIDATE NOVALIDATE.txt

今天要在生产系统中建立一个约束,犯了一点点小错误,看书复习记录一下:

我参考了这个链接:
http://www.databasedesign-resource.com/enabling-and-disabling-oracle-constraints.html
http://space.itpub.net/13387766/viewspace-617654

一、组合特性说明:  

是否要求满足约束         Validate                                Novalidate
------------------------------------------------------------------------------------
                        已有记录     新增/修改记录        已有记录    新增/修改记录
Enable                  Yes        Yes                     No          Yes
Disable                 Yes         No                      No           No


Validate确保已有数据符合约束;
Novalidate不必考虑已有数据是否符合约束。
除非Novalidate被指定,Enable默认Validate;
除非Validate被指定,Disable默认Novalidate;

Validate和Novalidate对Enable和Disable没有任何默认暗示。
Enable Validate与Enable相同,检查已有记录和新增记录,确保都符合约束;
Enable Novalidate 允许已有记录不必满足约束条件,但新增/修改的记录必须满足;
Disable Validate禁用约束,删除约束上的索引,不允许修改任何被约束的记录;
Disable Novalidate与Disable相同,禁用约束,删除约束上的索引,且允许修改被约束的记录。


如果设置约束是Disable Validate这个特性很有意思,可以实现只读表的功能。
不过11G允许设置表为只读。

测试如下:
1.建立测试例子:
create table a (id number);
insert into a select rownum  from dual connect by level <=10;
commit ;

alter table a add constraint ck_a check (id<=100) disable;

2.测试:
SQL> select status,validated from dba_constraints where wner=user and constraint_name='CK_A';
STATUS   VALIDATED
-------- -------------
DISABLED NOT VALIDATED

--可以发现状态是DISABLED和NOT VALIDATED,这样可以DML数据:

SQL> insert into a values(199);
1 row created.
SQL> rollback ;
Rollback complete.

3.修改约束属性:
SQL> alter table a disable validate constraint ck_a;
Table altered.


SQL> select status,validated from dba_constraints where wner=user and constraint_name='CK_A';
STATUS   VALIDATED
-------- -------------
DISABLED VALIDATED

--可以发现状态是DISABLED和NOT VALIDATED,这样就变成了只读表。

SQL> insert into a values(199);
insert into a values(199)
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (SCOTT.CK_A) disabled and validated


SQL> insert into a values(19);
insert into a values(19)
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (SCOTT.CK_A) disabled and validated


SQL> update  a set id =10 where id=1;
update  a set id =10 where id=1
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (SCOTT.CK_A) disabled and validated


SQL> delete from a where id=1;
delete from a where id=1
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (SCOTT.CK_A) disabled and validated

4.删除约束:
SQL> alter table a drop constraint ck_a;
Table altered.

5.我前面使用约束条件是id<100.如果换成1=1就可以实现同样的功能。
--SQL> alter table a add constraint ck_a check (1=1) disable novalidate;

SQL> alter table a add constraint ck_a check (1=1) disable;
Table altered.

SQL> alter table a modify constraint ck_a  disable validate;
Table altered.

--oracle 的语法真奇怪,前面我使用的是alter table a disable validate constraint ck_a;也可以。
--还是这里使用的语法更好1点。


SQL> insert into a values(19);
insert into a values(19)
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (SCOTT.CK_A) disabled and validated

6.我的测试环境是11G:
SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production


SQL> alter table a drop constraint ck_a;
Table altered.

SQL> alter table a read only ;
Table altered.

SQL> insert into a values(19);
insert into a values(19)
            *
ERROR at line 1:
ORA-12081: update operation not allowed on table "SCOTT"."A"

--取消只读特性。
SQL> alter table a read write  ;
Table altered.








来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-741814/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/267265/viewspace-741814/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracleconstraint是用于定义表数据的限制条件,以确保数据的完整性和一致性。constraint可以应用于列级别或表级别,可以定义以下类型的限制条件: 1. Primary key:主键约束用于定义表的唯一标识符,确保每行数据都有唯一的标识符。 2. Foreign key:外键约束用于定义表之间的关系,确保在一个表的数据必须在另一个表存在。 3. Unique:唯一约束用于确保表的某列数据是唯一的。 4. Check:检查约束用于定义表数据的条件,确保数据满足特定的条件。 5. Not null:非空约束用于确保表的某列数据不为空。 6. Default:默认约束用于定义表某列的默认值。 通过使用constraint,可以确保表的数据满足特定的条件,从而提高数据的完整性和一致性。 ### 回答2: 在OracleConstraint(约束)是一种用于限制表数据的有效性和完整性的对象。它可以在创建表时定义,也可以在表创建之后添加。 在创建表时定义Constraint,可以在列定义使用“CONSTRAINT”关键字,后面紧跟着约束类型和名称。例如: CREATE TABLE student ( id NUMBER CONSTRAINT student_id_pk PRIMARY KEY, name VARCHAR2(20) CONSTRAINT student_name_nn NOT NULL, age NUMBER CONSTRAINT student_age_ck CHECK(age > 0), class_id NUMBER CONSTRAINT student_class_id_fk REFERENCES class(id) ); 上面的例子,“student_id_pk”是表的主键约束,“student_name_nn”是非空约束,“student_age_ck”是检查约束(要求年龄大于0),而“student_class_id_fk”是外键约束,引用了“class”表的“id”列。 除了在列定义定义约束,还可以使用ALTER TABLE命令来添加Constraint。例如,添加一个新的唯一约束: ALTER TABLE student ADD CONSTRAINT student_name_uk UNIQUE(name); 在删除表的数据时,如果违反了Constraint的限制,则会抛出异常并终止操作。例如,如果试图插入一个重复的“name”值: INSERT INTO student VALUES (1, 'Tom', 18, 1); INSERT INTO student VALUES (2, 'Tom', 20, 1); -- 插入失败,抛出异常 在修改表结构时,也可以使用ALTER TABLE命令修改Constraint。例如,将“student_name_uk”约束修改为非空约束: ALTER TABLE student MODIFY CONSTRAINT student_name_uk NOT NULL; 总之,在Oracle使用约束可以确保数据的完整性和有效性,避免了数据不一致和错误。在设计和使用表时,应该充分利用约束来保证数据的正确性。 ### 回答3: Oracle数据库constraint是用来保证数据完整性和一致性的非常重要的工具。constraint可以设定在表的一列或多列上,以限制数据的输入范围或特定的约束条件。下面我们具体介绍一下constraintOracle数据库的用法: 1. Primary Key Constraint Primary Key是指一个或多个列的唯一标识符,用于保证表每一行数据的唯一性。Primary Key Constraint可以由多个列组合而成,但是不允许出现空值。一个表只能拥有一个Primary Key Constraint。例如:在一个学生表,学生ID可以作为Primary Key,以确保学生ID的唯一性。 2. Unique Constraint Unique Constraint用于保证表每一个列的唯一性。与Primary Key Constraint不同的是,它允许出现空值。一个表可以拥有多个Unique Constraint。例如:在一个学生表,学生手机号码可以设置为Unique Constraint,以确保每个手机号码只被使用一次。 3. Foreign Key Constraint Foreign Key Constraint用来确保两个表之间的数据关联性。例如:在学生表和班级表之间,学生表的班级ID列与班级表的班级ID列应该是一致的,即学生表的班级ID必须存在于班级表。因此,我们需要使用Foreign Key Constraint来确保这样的一致性。 4. Check Constraint Check Constraint用来规定列数据的合法性和有效性。例如:在学生表,年龄列的取值范围应该是0到100岁之间,我们可以使用Check Constraint来限制年龄的取值范围。 5. Not Null Constraint Not Null Constraint用来规定列的数据不允许为空。例如:在学生表,学生姓名列不允许为空,我们可以使用Not Null Constraint来保证学生姓名列的数据完整性。 总之,constraintOracle数据库保证数据完整性和一致性的非常重要的工具,可以用来规定列数据的合法性、有效性、唯一性以及关联性等方面的约束条件。正确使用constraint可以让我们的数据库更加规范、安全和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值