定义参照完整性

定义参照完整性的概念:
现实世界中的实体之间往往存在着某种联系,在关系模型中实体及实体之间的联系都是用关系来描述的,因此可能存在着关系与关系间的引用。
例如:学生实体和专业实体可以用下面的关系模式表示,其中主键用下划线标识:
学生(学号,姓名,性别,年龄,班级编号)
班级(班级编号,班级名称,年级,班级最大人数)

这两个关系之间存在着属性的引用,即学生关系引用了班级关系的主键“班级编号”。显然,学生关系中的“班级编号”值必须在班级关系中确实存在的班级编号,即班级关系中有该班的记录。这也就是说,学生关系中的“班级编号”的取值需要参照班级关系中“班级编号”的取值,“班级编号”是班级关系的主键,在学生关系中“班级编号”是外键。

定义参照完整性约束定义外键与主键之间的引用规则,即外键的取值或为空,或者等于被参照关系中的某个主键的值,需要遵守以下规则:
(1)被参照表已经使用create table语句创建,或者必须是当前正在创建的表,后者称为自参照表,即参照表与被参考表时同一个表;
(2)必须为被参照表定义主键或候选键;
(3)必须在被参照表的表名后面指定列或列名的组合,这个列或列组合必须是被参照表的主键和候选键;
(4)尽管主键是不能够包含空值的,但允许外键中出现空值。这意味着,只要外键的非空值出现在指定的主键中,这个外键的内容就是正确的;
(5)外键对应列的数目必须和被参照表的主键对应列的数目相同;
(6)外键对应列的数据类型必须和被参照表的主键对应的列的数据类型相同;
(7)外键只可以用在使用存储引擎innodb创建的表中,其他引擎不支持外键。

创建表的同时,创建外键约束,参照完整性约束方式定义外键,语法:
(1)列级方式:字段名 数据类型 references 被参照表名(列名)
(2)表级方式:constraint 外键约束名字 foreign key (列名1,…,列名n) references
被参照表(列名1,…,列名n)。
例1:
先创建被参照表tb_class,该表包括班级编号,班级名称,所属院系,年级,班级最大人数,建表如下:
use db_school;
create table tb_class
(
classno char(6) primary key,
classname varchar(20) ,
department varchar(30) ,
grade int,
classnum int
constraint uq_class unique(classname)
);
再创建参照表tb_student,要求以列级参照完整性约束方式定义外键。
create table tb_student
(
studentno char(10) prmiary key,
studentname varchar(20),
sex char(2),
birthday date,
classno char(6) references tb_class(classno)
);
再创建参照表tb_student,要求以表级参照完整性约束方式定义外键。
create table tb_student
(
studentno char(10),
studentname varchar(20),
sex char(2),
birthday date,
classno char(6) ,
constraint pk_studentno primary key(studentno),
constraint fk_classno foreign key(classno) references tb_class(classno)
);
上面的语句中,constraint fk_student foreign key (classno)references tb_class(classno) 完成外键约束命名和定义;

添加表约束,用alter table…add constraint语句为参照表添加外键约束,语法如下:
alter table 参照表 add constraint 外键约束名 foreign key(参照表外键字段1,
…字段名n) references 被参照表表名(被参照表字段名1,…字段名n);
例:为上面的tb_student中的 classname添加外键,约束名为fk_classname,sql语句如下:
alter table tb_student add constraint fk_classname foreign key(classname) references tb_class(classname);
删除表外键约束,语法如下:
alter table 参照表 drop foreign key 外键约束名;
例如:alter table tb_student drop foreign key fk_classno;

你可能感兴趣的:(MySQL)