代码改变世界

Oracle 10G中关于约束在表和列中使用详解.

2010-02-22 18:25  chenkai  阅读(2569)  评论(0编辑  收藏  举报

A:Check约束

代码
 1 --创建表
 2 create table order_status
 3 
(
 4   id integer constraint order_status_pk primary key
 ,
 5   status varchar(120
) ,
 6   last_modified date default
 sysdate
 7 
);
 8 --添加Check约束

 9 alter table order_status 
10 add constraint order_status_ck check (status in('BeiJing','ShangHai','TaiWan'
));
11 

12 alter table order_status
13 add constraint order_status_id_ck check(id>10
);
14 --测试数据

15 insert into order_status(id,status)
16 values(132,'ShangHai');

注意:

(1)在创建Check约束时,表中所有的行必须满足添加约束条件, 如果在添加约束已经存在数据 条件不满足会提示一个ORA-02293错误:截图如下:

一般处理在添加约束前最好清空原表中数据,上面提示错误有一个例外:在添加约束将其禁用. 这就涉及到"启用约束"和"禁用约束"操作.后面详解.还可以指定Enable Novalidate选项.从而使约束只适用于新添加数据.而不必管约束添加前数据.在插入数据时如果数据不符Check约束会提示一个ORA-02290错误.修改插入数据即可.

B:Not Null约束

代码
 --添加上述创建表 not null约束
 alter table order_status
 modify status 
constraint  order_status_newref not null
;
 
 alert 
table
 order_status
 modify last_modified 
not null
;
 
 格式:注意使用Modify 而非以前使用的Add 
Constraint

 格式如下:
 alert 
table [表名] modify [表中列名] constraint [约束唯一标示] not null;

 注意:

A1:在为Last_modified添加约束时 并没有使用约束命名 是允许的 系统会自动分配一个名称来标识. 但建议使用手动使用一个有意义的命名 出现错误容易判断出处

C:Foreign Key外键约束.

代码
 1 --创建一个外键约束测试表
 2 create global temporary table test_orderstatus
 3 (
 4   id integer constraint order_statustest_pk primary key,
 5   status_id number(15),
 6   status varchar(120),
 7   last_modifieddate date default sysdate
 8 );
 9 
10 --添加一列 先删除 后添加
11 alter table test_orderstatus
12 drop  column status_id;
13 
14 alter table test_orderstatus
15 add constraint order_status_modify_fk status_id reference order_status(id);
16 

  对Foreign key 使用On Delete Cascade子句.即指定当父表中删除一行记录时 回自动删除子表中于其外键关联的行记录.

1 --附带自动级联更新
2 alter table test_orderstatus
3 drop  column
 status_id;
4 

5 alter table test_orderstatus
6 add constraint order_status_modify_fk status_id reference order_status(id) on delete cascade;

 当在删除了父表一条记录时可以不删除子表记录. 全部设置字表中于外键关联所有记录为Null 则使用On Delete Cascade Null子句. 同样加在 外键约束后位置.当删除一条父表记录时.字表所有通过当前外键同父表关联的数据都设置为空值.

D:Unique约束

1 --添加Unique约束
2 alter table order_status
3 add constraint order_status_uq unique(status);

E:删除约束(Delete References)

1 --删除刚刚设置的Unique约束
2 alter table order_status
3 drop constraint order_status_uq;【约束唯一标识】

当需要手动编码删除约束时. 找到约束唯一命名是关键. 所以推荐建立使用有意义的约束命名.容易识别

F:禁用约束(Disable References)

--在创建时就禁用约束
alter table order_status
add constraint order_status_uq unique(status) disable;

添加约束默认是在创建后自动启用的. 创建时可以直接禁用 直接尾部加一个Disable子句 如果在创建后 在来禁用约束则使用Alter table .....Disable Constraint子句

1 --使用中禁用约束
2 alert table order_status
3 disable constraint order_status_uq;【禁用上面创建唯一约束】

 E:启用约束(ReStart References)

1 --启用已经创建约束
2 alert table order_status
3 enable constraint order_status_uq;

约束默认在创建后自动启用.要启用约束注意当前表中所有数据必须满足约束条件. 不然会包ORA-02293错误.当然有时为了需要可以只对新插入数据进行约束.原始依然存在,使用Alter Table.......Enable Novalidate. 默认是Enable Constraint.

--只对新插入的数据才执行当前约束
alert table order_status
enable novalidate 
constraint order_status_uq;

shangmian我们在用到上面第一个Check约束时也谈到这个问题.当我们建立Check约束,因为表中在建立约束前原来还存在数据 其中这些数据有些不符合当前约束的 但是我们不想删掉. 那么使用Enable Novalidate子句就是一个很好选择, 它子对新插入的数据其约束. 原始数据进行保留.

G:延迟约束(Deferred Constraint)

延迟约束是在事务被提交时强制执行的约束.添加约束时可以通过Deferrable子句来指定约束为延迟约束. 约束一但创建以后, 就不能修改为Deferrable延迟约束.唯一办法: 删除该约束,只能在创建指定为延迟约束即可.

1 --当前来指定上述创建的唯一约束为延迟约束 先删除已经创建唯一约束 
2 --在创建中再次指定为延迟
3 alter table order_status
4 drop constraint
 order_status_uq
5 

6 alert table order_status
7 add constraint order_status_uq unique (status) deferrable initially deferred;

注意上面再添加约束时. 可以将其标识为Initially Immediate 或Initially Deferred.

其中Initially Immediate意思是每次向表中添加数据,修改数据或是从表中删除数据时.都要检查这个约束.(这与约束默认行为相同). 而Initially Deferred.意思是只有事务被提交时才检查这个约束. 上述我们指定的Deferred . 即在只有事务提交时才检查该约束.

H:获取关于约束系统信息

可以通过查询User_Constraints表获得当前所有关于约束的系统信息.下面关于约束User_Constraints表常用信息字段说明:

Owner——约束所有者

Constraint_name——约束名称

Constraint_Type——约束类型:C:代表Check或Not Null约束.  P:主键约束.   R:外键约束.  U:唯一约束.  V:Check option约束.  O:Readonly 只读约束

Table——name——约束定义针对表名

Status_约束的状态 Enable或Disable 可用或不可用

Deferrable:是否为延迟约束 值为:Deferrable或Not Deferred.

Deferred:是否采用延迟 值为:IMMEDIate或Deferred.

1 --查看全部的关于order_status'表约束信息
2 select * from user_constraints where table_name='order_status'

shangshu是关于表的约束. 对于表中特定的列只需查询User_cons_columns表即可 不在赘述.

无觅相关文章插件,快速提升流量