oracle的完整性约束

来源:互联网 发布:vb用什么软件编写 编辑:程序博客网 时间:2024/05/16 00:25

oracle 的完整性约束

一、约束的分类

oracle数据库定义了五种约束:
1、 not null 非空约束,定义列不能为空。此定义只能在列级定义。
2、unique 唯一约束,表中的每一行所定义的列或列值不能相同。
3、primary key 主键约束,主键(primary key)是表中的**一个或多个字段,它的值**_ 用于唯一地标识表中的某一条记录_。
4、foreign key 就是表与表之间的某种约定的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关连性更强。foreign key外键约束是一列或多列的组合, 其定义必须和父表的父键保持一致。每一个非空的foreign key都必须在父表的父键里面找到对应的值。
5、check 条件约束可以应用于一个或者多个列,也可以将多个CHECK 约束应用于一个列。当除去某个表时,对这个表的CHECK 约束也将同时被去除。


主外键的关系:
1. 在默认的Oracle外键配置条件下,只要有子表记录存在,主表记录是不允许修改或者删除的。子表记录也必须时刻保证参照完整性。(简单解释就是主键存在外键约束,不能随意删改主键的值,也不能随意将外键修改为主键中没有的值)。
2.


二、查询约束

通常使用 这两个数据字典查询表的约束和行的约束信息

**
USER_CONSTRAINTS: 记录了表的约束信息
USER_CONS_COLUMNS:记录了列的约束信息

**


三、约束的增删改

注意:约束的定义分为:
1. 列级定义,只引用一个列,表中可以有多个列级约束。2.表级定义,引用一个或者多个列,通常用来定义主键。3.追加定义,建表后,再通过alter table 命令追加约束。

1. 定义唯一约束语法

列级定义

creater table a1(id number(2) unique );   

表级定义

create table a1(id number(2),constraint constraintname unique(id,columns....));

追加定义

alter table tablename add constraint constraintname unique;

2. 定义非空约束

列级定义

creater table a1(id number(2) not null);

表级定义
无。
追加定义

alter table tablename modify dname not null;

3. 定义check约束

创建表的时候定义

create table t1(id number(2),name varchar2(3)constraint check_name check(name in('nan','nv')));

追加check约束

alter table tablename add constraint contraintname check( 约束条件 )[disable];

* disable 是可选项,使用了disable关键字,表示约束被创建后,check约束不会生效。*
启动check约束

alter table table-name enable constraint constaint_name;

禁用check约束

alter table table_name disable constraint constraint_name;

删除check约束

alter table table_name drop constraint constraint_name;

查看check状态例子:

**
–查看约束的详细信息
select
constraint_name,–约束名称
constraint_type,–约束类型
table_name,–约束所在的表
search_condition,–约束表达式
status–是否启用
from user_constraints–[all_constraints|dba_constraints]
where constraint_name=’CHECK_TB_SUPPLIER_ID’;
**

4.定义主键约束

列级定义

create table  t1(id number(2) primary key,name varchar2(20));

表级定义

creater table t1(id number(2),name varchar2(20) constraint pk_name primary key(id));

追加定义(单列主键)

alter table table_name add constraint pk primary key(id);

多列主键

alter table table_name add constraint pk primary key(id,name);

禁用check约束

alter table table_name disable constraint constraint_name;

启动check约束

alter table table-name enable constraint constaint_name;

删除check约束

alter table table_name drop constraint constraint_name;

主键指能唯一标识一条记录的单个数据表列或联合的数据表列(联合主键|复合主键)。主键用到的数据表列数据不能包含空值。而且,一张表只能包含一个主键。(主键创建时自建索引)
在Oracle数据库中,联合主键的列不能超过32个。主键可以在创建表时定义或者通过ALTER TABLE语法定义。


5.定义外键

外键是该表是另一个表之间联接的字段
外键必须为另一个表中的主键
外键的用途是确保数据的完整性。它通常包括以下几种:
实体完整性,确保每个实体是唯一的(通过主键来实施)
域完整性,确保属性值只从一套特定可选的集合里选择
关联完整性,确保每个外键或是NULL(如果允许的话)或含有与相关主键值相配的值

创建表的时候定义外键:

create table table_name (id number(2),name varchar2(20) constraint fk_colum foreign key (column1,column2,...) references parent_tab(column1,column2.....column_n));

基于多列的外键

追加定义外键

alter table table_name add constraint constraint_name foreign key (column1,column2,.......column_n) references parent_table(column1,column2,......column_n) on delete cascade;

**
on delete cascade 使用详细解释
**

**
“级联删除”,对开发人员来讲是一种方便的策略,可以直接“无视”子记录而删掉主记录。但是,一般情况下,数据库设计人员和DBA一般都不推荐这样的策略。
究其原因,还是由于系统业务规则而定。On delete cascade的确在一定程度上很方便,但是这种自动操作在一些业务系统中是可能存在风险的。例如:一个系统中存在一个参数引用关系,这个参数被引用到诸如合同的主记录中。按照业务规则,如果这个参数被引用过,就不应当被删除。如果我们设置了on delete cascade外键,连带的合同记录就自动的被“干掉”了。开发参数模块的同事一般情况下,也没有足够的“觉悟”去做手工判定。基于这个因素,我们推荐采用默认的强约束关联,起码不会引起数据丢失的情况。
**

on delete set null :
除了直接删除记录,Oracle还提供了一种保留子表记录的策略。注意:外键约束本身不限制字段为空的问题。如果一个外键被设置为on delete set null,当删除主表记录的时候,无论是否存在子表对应记录,主表记录都会被删除,子表对应列被清空。
语法:

alter table table_name add contraint contraint_name forgin key(colnum) references prim(colnum) on delete set null;

简单说就是将主表的主键删除后外键相对的列被设置为NULL,此列不能添加约束为NOT NULL。

使用外键的注意事项:

Oracle外键是我们日常比较常见的约束类型。在很多专家和业界人员的讨论中,我们经常听到“使用外键还是系统编码”的争论。支持外键策略的一般都是数据库专家和“大撒把”的设计师,借助数据库天然的特性,可以高效实现功能。支持系统编码的人员大都是“对象派”等新派人员,相信可以借助系统前端解决所有问题。

笔者对外键的观点是“适度外键,双重验证”。外键要设计在最紧密的引用关系中,对验证动作,前端和数据库端都要进行操作。外键虽然可以保证最后安全渠道,但是不能将正确易于接受的信息反馈到前端。前端开发虽然比较直观,但是的确消耗精力。所以,把握适度是重要的出发点。

0 0
原创粉丝点击