我们都知道在数据库MYSQL当中有三种不同的完整性约束,分别为:实体完整性,参照完整性和用户定义完整性。
直接上干货篇:
通俗的讲:实体完整性是用来约束主键(primary key)和候选键(unique)。 参照完整性是用来约束外键(foreign)的。 用户定义完整性基本是用来限制数据 (非空和check)。
而以上的这几种约束又有两种具体的约束方式分别为:列级完整性约束和表级完整性约束。
接下来我们用例子来具体讲述,上实例,这是一张学生信息表和一张班级表,后面我们都将用它来做案例讲解。
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 )
) ;
CREATE TABLE IF NOT EXISTS tb_class
(
classNo CHAR(6) PRIMARY KEY,
className VARCHAR(20) ,
department VARCHAR(30) ,
grade int,
classNum int
);
主键
比如我要把student表中的学生编号(studentNo)定义为主键,列级定义就是直接在后面加上primary key,如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) PRIMARY KEY ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 )
) ;
而表级定义则有两种方式,一种是在表未加上primary key()还有一种则是使用constraint语句,如下。PS:为了方便比较我将两个语句放在同一张表中,但实际情况中只有一个即可。
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ),
PRIMARY KEY (studeentNO)
CONSTRAINT PK_student PRIMARY KEY(studentNO)
) ;
候选键
候选键的话很大程度上和主键是相似的
比如我要把student表中的学生姓名(studentNname)定义为候选键,列级定义就是直接在后面加上unique,如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) UNIQUE,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 )
) ;
而表级定义则依旧是使用constraint语句,如下。
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ),
CONSTRAINT UN_student UNIQUE(studentName)
) ;
如果表里面有多个候选键的话我们只需要在括号里添加列名即可用“,”隔开就行。 如: CONSTRAINT UN_student UNIQUE(studentName,sex)
关于主键和候选键还要注意以下几点:
1.一个表中只能定义一个PRIMARY KEY,但可以定义多个UNIQUE。
2.PRIMARY KEY列不允许有空值,而UNIQUE可以有空值。
3.我们在定义PRIMARY KEY和UNIQUE时系统会对其分别产生索引。
外键
外键的作用作用就是连接两表。外键在定义之前还要满足几个要求:
1.必须有两个表即参照表和被参照表。被参照表必须是已用create table创建或者正在被创建的表。如果是后一种情况的话,则被参照表和参照表是同一个表,这样的表被叫做自参照表。
2.外键必须为被参照表上的主键或者候选键。且外键对应列的数目必须和被参照表的主键对应列的数目相同。
3.必须在被参照表的表名后面指定列名或列名的组合,这个列或列组合必须是被参照表的主键或候选键。
4.尽管主键是不能够包含空值的,但允许在外键中出现空值。这意味着,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
5.外键对应列的数据类型必须和被参照表的主键对应列的数据类型相同
满足这几个要求就可以啦,比如我要把student表中的班级编号(classNo)定义为外键,对应class表中的主键班级编号(classNo),列级定义就是直接在后面加上references,如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ) REFERENCES tb_class(classNo)
) ;
而表级定义则依旧是使用constraint语句,如下。
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ) ,
CONSTRAINT FK_student FOREIGN KEY (classNO) REFERENCES tb_class(classNo)
) ;
非空约束
顾名思义就是有些列不能被设置为控制,所以我们对其进行非空约束,这样一旦出现空值的时候系统就会报错。使用方法只有一种如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) NOT NULL,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ) ,
) ;
还记得我们的主键不能为空原则嘛,可以联合使用哦,如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) NOT NULL PRIMARY KEY,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ) ,
) ;
CHECK约束
check主要是针对数据条件上的约束,也有列级约束和表级约束两种形式。这样说可能有些抽象,那么话不多说了,上实例:
比如我要对student表中的性别(sex)添加一个约束,要求此列只能出现男或者女这两种情况,列级定义就是直接在后面加上check语句,如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ) CHECK ( sex='男' OR sex='女' ),
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 )
) ;
那我们的表级定义同样是用constraint语句,如下:
CREATE TABLE IF NOT EXISTS tb_student (
studentNo INT ( 10 ) ,
studentName VARCHAR ( 20 ) ,
sex CHAR ( 2 ) ,
birthday date,
native VARCHAR ( 20 ),
nation VARCHAR ( 10 ) ,
classNo CHAR ( 6 ) ,
CONSTRAINT CK_student CHECK ( sex='男' OR sex='女' )
) ;
通过我们以上几个例子我们还可以发现:constraint语句的好处就是可以对定义的主键,候选键,外键等等……进行命名。而在目前的MYSQL中我们并没有办法对列级的约束进行命名,所以我们的constraint语句被广泛的欢迎和使用。