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


原文地址:http://www.cnblogs.com/chenkai/archive/2010/02/22/1671442.html。点击打开链接

Check约束

代码

--创建表
create table order_status
 (
  id integer constraint order_status_pk primary key ,
   status varchar(120) ,
   last_modified date default sysdate
 );
 --添加Check约束
 alter table order_status 
 add constraint order_status_ck check (status in('BeiJing','ShangHai','TaiWan'));
 
 alter table order_status
 add constraint order_status_id_ck check(id>10);
 --测试数据
 insert into order_status(id,status)
 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外键约束.

代码:

--创建一个外键约束测试表
 create global temporary table test_orderstatus
 (
   id integer constraint order_statustest_pk primary key,
   status_id number(15),
   status varchar(120),
   last_modifieddate date default sysdate
 );
 
 --添加一列 先删除 后添加
 alter table test_orderstatus
 drop  column status_id;
 
 alter table test_orderstatus
 add constraint order_status_modify_fk status_id reference order_status(id);

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

--附带自动级联更新
 alter table test_orderstatus
 drop  column status_id;
 
 alter table test_orderstatus
 add constraint order_status_modify_fk status_id reference order_status(id) on delete cascade;
当在删除了父表一条记录时可以不删除子表记录. 全部设置字表中于外键关联所有记录为Null 则使用On Delete Cascade Null子句. 同样加在 外键约束后位置.当删除一条父表记录时.字表所有通过当前外键同父表关联的数据都设置为空值.

D:Unique约束

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

E:删除约束(Delete References)

--删除刚刚设置的Unique约束
 alter table order_status
 drop constraint order_status_uq;

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

禁用约束(Disable References)

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

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

--使用中禁用约束
 alert table order_status
 disable constraint order_status_uq;
E:启用约束(ReStart References)

--启用已经创建约束
 alert table order_status
 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延迟约束.唯一办法: 删除该约束,只能在创建指定为延迟约束即可.

--当前来指定上述创建的唯一约束为延迟约束 先删除已经创建唯一约束 
 --在创建中再次指定为延迟
 alter table order_status
 drop constraint order_status_uq
 
 alert table order_status
 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.

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

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值