一、完整性约束的定义
完整性约束(或简称“约束”)是数据库的内容必须随时遵守的规则,它们描述了对数据库的哪一次更新是被允许的。一旦定义了完整性约束,Mysql就会负责在每次更新后,测试新的数据内容是否符合相关的约束。
二、完整性约束的分类
2.1主键约束
主键就是表中的一列或多个列的一组,它们能够唯一地标识表中的每一行。
通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。
可以用两种方式定义主键,作为列或者表的完整性约束。作为列的完整性约束时,只需要在列定义的时候加上关键字PRIMARY KEY 。作为表的完整性约束时,需要在定义的最后列后加上一条PRIMARY KEY(列名,...)语句。
原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则:
1、每个表只能定义一个主键。
2、关系模型理论要求必须为每一个表定义一个主键。mysql中并没有这样的要求,可以创建一个没有主键的表。为了安全起见,建议为每个基础表指定一个主键。
3、表中的两个不同的行在主键上不能具有相同的值。即“唯一性原则”。
4、如果从一个复合主键中删除一列后,剩下的列构成的主键仍然满足唯一性原则,那么,这个复合主键是不正确,即“最小化规则”。
5、一个列名在一个主键的列的列表中只能出现一次。
2.2替代键约束
在关系模型中,替代键像主键一样是表的一列或者一组列,它们的值在任何时候都是唯一的。
替代键是没有被选作主键的候选键。
定义替代键的关键字是UNIQUE。
替代键与主键的主要区别:
1、一个表只能有一个主键,但可以有多个候选键,甚至可以重合。
2、主键字段的值不能为空,候选键可以。
3、都可以自动产生索引。
2.3参照完整性约束
参照完整性约束是一种特殊的完整性约束,表现为一个外键。
当指定一个外键的时候,应遵循以下规则:
1、必须为被参照表定义主键
2、必须在被参照表的表名后面指定列名。这个列必须是这个表的之间或替代键。
3、外键中列的数目必须和被参照表的主键中列数目相同。
4、外键列的数据类型必须和被参照表主键中列的数据类型相同。
2.4CHECK完整性约束
当我们需要限定一些数据的范围时,可以使用check完整性约束。
CHECK完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约。
2.5命名完整性约束
如果一条INSERT、UPDATE或DELETE语句违反了完整性约束,则MySql返回一条出错的消息并且拒绝更新,一个更新可能会导致多个完整性约束的违反。在这种情况下,应用程序获取几套出错消息。为了确切地表示出是违反了哪一个完整性约束,可以为每个完整性约束分配一个名字,随后,出错消息包含这个名字,从而使得消息对于应用程序更有意义。
三、案列
3.1.1主键定义:创建表xs1,将姓名定义为主键:
create table wfx.xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null primary key,
出生日期 datetime
);
3.1.2复合主键的定义: 创建course表,学号、课程号、毕业日期定义为主键:
create table course
(
学号 varchar(6) not null,
姓名 varchar(8) not null,
毕业日期 date not null,
课程号varchar(3),
学分tinyint,
primary key(学号,课程号,毕业日期)
)
3.1.3通常MySQL自动地为主键创建一个索引primary。我们可以重新给这个索引起名:
primary key index_primary(学号,课程号,毕业日期)
3.2.1定义一个替代键:
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null unique,
出生日期 datetime
);
3.2.2定义为表的完整性约束:
create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime
unique(姓名)
);
3.3.1创建表xs2,xs1表中所有学生学号都必须出现在xs2表中:
create table xs2(
学号 varchar(6) null,
姓名 varchar(8) nut null,
出生日期 datetime null,
primary key(姓名)
foreign key(学号)
references xs1(学号)
on delete restrict
on update restrict
);
3.3.2与外键相关的被参照表和参照表可以是同一个表,这样的表成为自参照表:
create table wfx.xs2(
学号 varchar(6) not null,
姓名 varchar(8) not null,
出生日期 datetime null,
primary key(学号),
foreign key(学号)
references xs2(学号)
)
3.4.1创建表student,性别只能是男或女:
create table wfx.student(
学号 varchar(6) primary key,
gender char(6) not null
check(gender in('男','女'))
);
3.5.1创建表xs3,将姓名定义为主键:
create table xs3
(
学号 varchar(6) null,
姓名 varchar(8) not null ,
出生日期 datetime
constraint primary_key_xs3 primary key(姓名)
);
感觉有收获,就点个关注吧(感谢、感谢!)!持续更新......