!!详解oracle中的完整性约束
1.、 数据的完整性简介
就是正确性、准确性,和有效性。包含三种:实体完整性、参照完整性、用户自定义完整性。Oracle中主要通过约束、触发器、过程函数实现的。
本文主要介绍 通过【约束】来实现数据的完整性约束。 触发器和过程函数将会在后面章节介绍。
(1)实体完整性 :
实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。通过主键约束,唯一约束来实现实体完整性。
(1)主键约束:(非空非重复)
表中的一列或者几列组合的值能用来唯一的表示表中的每一行,这样的一列或者多列的组合叫做表的主键。
主键自带唯一性,并且不能为空,一个表只能有一个主键,主键确保了表中数据行的唯一,同一张表中,可以使用多个列共同作为主键。在选择主键时,应遵循两个原则,最少性和稳定性。
(2)唯一约束:
保证数据行中的某一列的数据是唯一的,不重复的。这样可以添加唯一约束。
唯一约束和主键的区别:
- 主键不能为空,唯一可以为空,但只允许有一个空值。
- 主键一张表中只有一个,而唯一可以有多个。
- 主键可以由多个表来组成,唯一只能是单列。
主键可以作为其他表的外键,唯一不可以。
(2)参照完整性: ()
参照完整性是指两个表中存在一定的联系,保证数据的完整性。要求关系中不允许引用不存在的实体。
举个栗子:
学生表(学号、姓名、系编号)
系(系编号,系名称)
其中 ,学生表的系编号参照系表的主键,学生表的系编号的值,必须在系的系编号值的范围内。其中学生表的外键取值可以为空,但不可以为系表中不存在的值。(3)用户自定义完整性:
在实际使用过程中,用户自己定义的完整性规则。
举个栗子:
职工表(职工号,姓名,出生日期,参加工作日期)其中用户自定义的出生日期不可以大于参加工作日期。
2、约束
约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACLE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。)
维护数据的完整性,有not null、unique、check、primary key、foreign key五种。
not null、 只能在列上定义,本列不能为空
unique、唯一约束,不可以重复,可以有一个值为空,可以定义在一张表中的多列上。
check、用户自定义对某列的约束,保证事物的取值在合法的范围内。
primary key、主键约束,不能为空,具有唯一性,一张表只能定义一个。
foreign key、外键约束。
小贴士 : not null 只能在列内定义,其余四中约束都可以在表内定义。
列内定义:就是指在创建表的时候创建列在‘,’之前所写的。
create table student(sno number not null ,sname varchar2(10));
表内定义:
create table student (sno number , sname varchar2(10),primary key(sno))
(1)not null
create table student (sno number,
sname varchar2(10) not null,
score number);
(2)check
create table student
(snumber number check(sno>0 and sno<100),
sname varchar2(10) not null,
score number);
(3)unique
create table yg (部门号 number not null ,
部门内编号 number ,
姓名 varchar2(10),unique(部门号,部门内编号));
(4)default
create table yg (编号 number ,姓名 varchar2(10),
基本工资 number(8,2) default 1000)
-- 默认值的插入方法
insert into yg values(1,'A',default);
insert into yg (编号,姓名)values(1,'A');
(5)primary key
create table yg (编号 number primary key,
姓名 varchar2(10),
基本工资 number(8,2) default 1000)
(6)foreign key(与上个例子有关)
create table address(姓名 varchar2(10),
员工编号 number(10) foreign key references yg(编号),
住址 varchar2(30))
3、约束的使用方式
3—1 建立约束的方式:(以建立主键为例)
- 自己没有为约束命名,oracle会自动为约束命名,放在user_constraints表中, 查找constraint_name即可找到。
语法: select * from user_constraints ; user_constraints表中参数介绍:
owner 用户 constraint_type 约束类型
constraint_name 约束名 table_name 表名①直接在列上指明,不为约束命名。
create table user1(userno number(6)primary key,
username varchar2(10));
②在列上声明,为约束命名。
create table user1(userno number(6)
constraint 约束名 primary key,
username varchar2(10));
③在表上声明,不为约束命名。
create table user1(userno number(6),username varchar2(10)
primary key(userno ));
④在表上声明,为约束命名。
create table user1(userno number(6),username varchar2(10)
constraint 约束名 primary key(userno));
⑤ 先建表,后加约束。
create table user1(userno number(6),username varchar2(10));
alter table user1 add constraints 约束名 primary key(userno);
小试牛刀:
建立2个表,一个是stuInfo(学号sno,姓名sname,年龄sage,性别smale,系编号deptNo),一个是department(系编号deptNo,
系名称deptName)。
要求:
每个表有主键。
stuInfo表建立外键。
学生的姓名不能为空。
学生的年龄要在18到50之间。
学生的性别必须是男女之一,默认是男。
stuInfo表的deptNo列,要参照department表的deptNo列。
--先建立department
create table department(deptno char primary key ,
deptname char(10))
-- 建立stulnfo
create table stulnfo
(sno char(6) constraint pk_2 primary key ,
sname varchar2(10) not null,
age int check(age>=18 and age<=60) ,
smale char(4) default "男" check (smale="男"or smale="女")
deptno char ,
foreign key( deptno) references department(deptno));
-- 创建固定长度的字符char的效率比varchar2()高。
-- 查看约束
select * from user_constraints u where u.table_name='STULNFO';
3—2、删除约束:
alter table 表名 drop constraint 约束名; (自己未命名的需要先查找其约束名)
以上表为例:
alter table department drop primary key ;
ORA-02273 表明 此表唯一主键已被其他表当做外键使用。
非要删除:
alter table department drop primary key cascade
;
– 与此相关的约束也会一并被删除。
drop table department;
ORA-02449 表明 此表唯一主键已被其他表当做外键使用。
drop table department cascade constraints;
3—3、禁用(disable)约束与启用(enable)约束:
禁用 alter table table_name disable constraint_name;
启用 alter table table_name enable constraint_name;