数据库——数据完整性和约束条件

表的五种约束

表共有五种约束,它们是主键、非空、唯一、检查和外键。

主键(PRIMARY KEY)

主键是表的主要完整性约束条件,主键唯一地标识表的每一行。一般情况下表都要定义主键,而且一个表只能定义一个主键。主键可以包含表的一列或多列,如果包含表的多列,则需要在表级定义。主键包含了主键每一列的非空约束和主键所有列的唯一约束。

主键约束

主键约束的语法如下:
 表级----
 [CONSTRANT 约束名]PRIMARY KEY --列级
 [CONSTRANT 约束名]PRIMARY KEY(列名1,列名2,...)
 
例、创建学生表(student),包括学号(Sno)、姓名(Sname)、系院(Sdept)等学生信息。其中学号(Sno)为主键。
CREATE TABLE student
(Sno char(6) PRIMARY KEY,
Sname varchar2(8),
Sdept char(20)
);
该语句将约束直接定义在字段后面,因此建立约束的字段名必须省略,并且命令中没有提供主键约束的名字,系统会自动为该约束提供一个名字。
该例还可写成如下两种形式。
形式一:
CREATE TABLE student
(Sno char(6) CONSTRAINT pk_student PRIMARY KEY,
Sname varchar2(8),
Sdept char(20)
);
该例在Sno字段上创建主键约束,是列级约束,约束名为pk_student。

形式二:
CREATE TABLE student
(Sno char(6),
Sname varchar2(8),
Sdept char(20),
CONSTRAINT pk_student PRIMARY KEY(Sno)
);
约束的定义与字段的定义相互独立,两者之间用逗号隔开,为表级约束,此时建立约束的字段名不能省略。

非空约束

非空约束(not null)指定某列不能为空,它只能在列级定义。在默认情况下,允许列的内容为空值。
非空约束语法如下:
[CONSTRANT 约束名]NOT NULL --列级

例、创建课程表(course),包括课程号(Cno)、课程名(Cname)、学分(Ccredit),要求课程号、课程名不能为空,在课程号字段定义主键约束。
CREATE TABLE course
(Cno char(3) PRIMARY KEY,
Cname varchar2(20) NOT NULL,
Ccredit number(3)
);

唯一约束

唯一约束条件(unique)要求表的一列或多列的组合内容必须唯 一,可以在列级或表级定义。但如果唯一约束包含表的多列,则必须在表级定义。

唯一约束的语法如下:
[CONSTRANT 约束名]UNIQUE --列级
[CONSTRANT 约束名]UNIQUE(列名1,列名2,...) ――表级

例、 重新创建课程表(course),包括课程号(Cno)、课程名(Cname)、学分(Ccredit),要求在课程号字段定义主键约束,在课程名字段上定义唯一约束。
CREATE TABLE course
(Cno char(3) PRIMARY KEY,
Cname varchar2(20) UNIQUE,
Ccredit number(3)
);
CREATE TABLE course
(Cno char(3) ,
Cname varchar(20) ,
Ccredit int,
constraint pk_cno primary key(Cno),
constraint un_cname unique(Cname)
)

检查约束

检查约束(check)条件是用来定义表的一列或多列的一个约束条件,使表的每一列的内容必须满足该条件。一个列上可以定义多个CHECK约束条件,一个CHECK约束可以包含一列或多列。如果CHECK约束包含表的多列,则必须在表级定义。

检查约束的语法如下
[CONSTRANT 约束名] CHECK(约束条件) --列级,约束条件中只包含本列
[CONSTRANT 约束名] CHECK(约束条件) --表级,约束条件中包含多列

例8 重新创建学生表(student),包括学号(Sno)、姓名(Sname)、性别(Sex)等学生信息。其中学号(Sno)为主键,并在年龄字段创建一个CHECK约束,使得性别只能输入男或女。
CREATE TABLE student
(Sno char(6) PRIMARY KEY,
Sname varchar2(8),
Sex char(2) CONSTRAINT ch_sex CHECK(Sex=’男’ or Sex=’女’));

外键约束

外键通常用来约束两个表之间的数据关系,这两个表含有主键或惟一键的称为主表,定义外键的那张表称为子表。外键的值可以为NULL,如果不为NULL,就必须是指定主键或惟一键的值之一。如果外键只包含一列,则可以在列级定义;如果包含多列,则必须在表级定义。外键的列的个数,列的数据类型和长度,应该和参照的主键或惟一键一致。
比如成绩表(sno,cno,grade)的“学号”列,可以定义成外键,参照学生表(sno,sname…)的“学号”列,但学生表的“学号”列必须先定义成为主键或惟一键。如果外键定义成功,则学生表称为主表,成绩称为子表。在表的创建过程中,应该先创建主表,后创建子表。
外键约束的语法如下:
第一种语法,如果子记录存在,则不允许删除主记录:
[CONSTRANT 约束名]FOREIGN KEY(列名1,列名2,...)REFERENCES --表名(列名1,列名2,...)
第二种语法,如果子记录存在,则删除主记录时,级联删除子记录:
[CONSTRANT 约束名]FOREIGN KEY(列名1,列名2,...)REFERENCES --表名(列名1,列名2,...)on delete cascade
第三种语法,如果子记录存在,则删除主记录时,将子记录置成空:
[CONSTRANT 约束名]FOREIGN KEY(列名1,列名2)REFERENCES --表名(列名1,列名2,...)on delelte set null
其中的表名为要参照的表名。

例8.9创建成绩表(score),包括学号(Sno)、课程号(Cno)、成绩性别(Grade)等信息。其中学号(Sno)、课程号(Cno)为外键。
CREATE TABLE score
(Sno char(6) REFERENCES student(Sno),
Cno char(3),
Grade number(3),
CONSTRAINT fk_sc FOREIGN KEY(Cno) REFERENCES course(Cno)
);

总结

在以上5种约束的语法中,CONSTRANT关键字用来定义约束名,如果省略,则系统自动生成以SYS_开头的惟一约束名。约束名的作用是当发生违反约束条件的操作时,系统会显示违反的约束条件名称,这样用户就可以了解到发生错误的原因。
添加主键约束:
alter table tablename add [constraint 约束名] primary key (主键字段);·
添加外键约束:
alter table 从表 add [constraint 约束名] foreign key 从表(外键字段) references 主表(主键字段);·

【例1】alter table student add [constraint pk_student] primary key (sno);
【例2】Alter table grade add [constraint fk_grade] foreign key (sno) references student(sno);
对于主表的列来说,没有主键约束和唯一性约束的列是没有资格作为列建立外键约束
删除主键约束:alter table 表名 drop primary key;·
删除外键约束:alter table 表名 drop foreign key 约束名;
alter table book drop primary key;
alter table book drop foreign key fk_book ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值