
3.8 操作表的约束
完整性约束条件是对字段进行限制,要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件,数据库系统将不再执行用户的操作。MySQL中基本的完整性约束条件如表3-11所示。
表3-11 完整性约束条件

从表3-11中可以看出,MySQL数据库系统不支持check约束。根据约束数据列限制,约束可分为单列约束(每个约束只约束一列数据)和多列约束(每个约束可约束多列数据)。
3.8.1 设置表字段的非空约束(NOT NULL,NK)
当数据库表中的某个字段上的内容不希望设置为NULL时,可以使用NK约束进行设置。NK约束在创建数据库表时为某些字段上加上“NOT NULL”约束条件,保证所有记录中的该字段都有值。如果在用户插入的记录中该字段为空值,那么数据库管理系统会报错。
设置表中某字段的NK约束非常简单,查看帮助文档可以发现,在MySQL数据库管理系统中是通过SQL语句NOT NULL来实现的,其语法形式如下:

在上述语句中,tablename参数表示所要设置非空约束的字段名字,propName参数为属性名,propType为属性类型。
【示例3-21】执行SQL语句NOT NULL,在数据库school中创建表t_class时设置classno为NK约束具体步骤如下:
(1)创建t_class,具体SQL语句如下,执行结果如图3-57所示。

(2)为了检验数据库school中的t_class表中字段classno是否被设置为NK约束,执行SQL语句DESCRIBE,具体如下,执行结果如图3-58所示。
DESCRIBE t_class;

图3-57 创建表格t_class

图3-58 查看表信息
3.8.2 设置表字段的默认值(DEFAULT)
当为数据库表中插入一条新记录时,如果没有为某个字段赋值,数据库系统就会自动为这个字段插入默认值。为了达到这种效果,可通过SQL语句关键字DEFAULT来设置。
设置数据库表中某字段的默认值非常简单,可以在MySQL数据库管理系统中通过SQL语句DEFAULT来实现,其语法形式如下:

在上述语句中,tablename参数表示所要设置默认值的字段名字,propName参数为属性名,propType为属性类型,defaultValue为默认值。
【示例3-22】执行SQL语句DEFAULT,在数据库school中创建表t_class时设置cname字段的默认值为“class_3”。具体操作如下:
创建表t_class,设置字段cname的默认值为“class_3”,再查看t_class表的信息,具体SQL语句如下,执行结果如图3-59、图3-60所示。


图3-59 创建表t_class

图3-60 查看表信息
从图3-60可以看出,表t_class中字段cname已被设置了默认值,如果用户插入的新记录中该字段为空值,那么数据库管理系统会自动插入值“class_3”。
3.8.3 设置表字段唯一约束(UNIQUE,UK)
当数据库表中某个字段上的内容不允许重复时,可以使用UK约束进行设置。UK约束在创建数据库时为某些字段加上“UNIQUE”约束条件,保证所有记录中该字段上的值不重复。如果在用户插入的记录中该字段上的值与其他记录中该字段上的值重复,那么数据库管理系统会报错。
设置表中某字段的UK约束非常简单,可以在MySQL数据库管理系统中通过SQL语句UNIQUE来实现,其语法形式如下:

在上述语句中,tablename参数表示所要设置默认值的字段对应的表名,propName参数为属性名,propType为属性类型,propName字段要设置唯一约束。
【示例3-22】执行SQL语句UNIQUE,在数据库school中创建表t_class时设置cname字段为UK约束。具体步骤如下:
(1)创建表t_class,再查看t_class表的信息,具体SQL语句如下,执行结果如图3-61、图3-62所示。


图3-61 创建表

图3-62 查看表信息
(2)从图3-62中可以看出,表t_class中字段cname已经被设置为UNIQUE约束。如果用户插入的记录中该字段有重复值,那么数据库管理系统会报如下错误,如图3-63所示。
ERROR 1062 (23000): Duplicate entry 'class_3' for key 'cname'
(3)如果想给字段cname上的UK约束设置一个名字,可以执行SQL语句CONSTRAINT。创建表t_class,具体SQL语句执行结果如图3-64所示。

图3-63 UK字段插入重复数据出错

图3-64 创建表
图3-64创建表的效果和图3-61创建表的效果是一样。
3.8.4 设置表字段的主键约束(PRIMARY,PK)
主键是表的一个特殊字段,能唯一标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证用来表明人的身份,每个人都具有唯一的身份证号。设置表的主键是指在创建表时设置表的某个字段为该表的主键。
主键的主要目的是帮助数据库管理系统以最快的速度查找到表的某一条信息。主键必须满足的条件就是主键必须是唯一的,表中任意两条记录的主键字段的值不能相同,并且是非空值。主键可以是单一的字段,也可以是多个字段的组合。
1. 单字段主键
单字段主键的语法规则如下:

其中,propName参数表示表中字段的名称,propType参数指定字段的数据类型。
【示例3-23】执行SQL语句UNIQUE,在数据库school中创建表t_class时设置classno字段为PK约束。具体步骤如下:
(1)创建表t_student,设置stuno字段为PK约束,再查看t_student表信息,SQL语句如下,执行结果如图3-65、图3-66所示。


图3-65 创建设置单一主键的表

图3-66 检验具有单一主键的表
(2)在表t_student中插入一组数据,如图3-67所示。
INSERT INTO t_student VALUES(1,'Justin',20,'m');
(3)在表t_student中插入一组重复主键的数据,会提示出错,如图3-68所示。
INSERT INTO t_student values(1,'rebecca',32,'f');

图3-67 在表里插入数据

图3-68 在表里插入重复主键的数据
(4)在表t_student中插入一组不同主键的数据,操作成功,如图3-69所示。
INSERT INTO t_student values(2,'rebecca',32,'f');

图3-69 在表里插入不同主键的数据
(5)如果想给stuno字段的PK约束设置一个名字,可以执行SQL语句CONSTRAINT。创建表t_student_pk,如图3-70所示;再使用DESC语句查看表结构,如图3-71所示。


图3-70 在表里设置约束标识符

图3-71 查看表结构
2. 多字段主键
主键是由多个属性组合而成时,在属性定义完之后统一设置主键。语法规则如下:

【示例3-24】多字段主键的设置。
(1)创建表t_student_m_pk,设置stuno和sname字段为联合主键,再查看t_student_m_pk表的信息,具体SQL语句如下,执行结果如图3-72、图3-73所示。


图3-72 创建设置联合主键的表

图3-73 查看t_student_m_pk信息
(2)从图3-73中可以看出,stuno和sname已经被成功设置为联合主键。向t_student_m_pk表中插入数据,SQL语句如下,执行结果如图3-74所示。
INSERT INTO t_student_m_pk values(1,'rebecca',32,'f'); INSERT INTO t_student_m_pk values(2,'rebecca',12,'f'); INSERT INTO t_student_m_pk values(1,'jack',12,'f'); INSERT INTO t_student_m_pk values(1,'rebecca',12,'f');

图3-74 创建设置联合主键的表
从图3-74中可以看到,向t_student_m_pk表中插入数据,如果有重复的联合主键,就会插入失败。
3.8.5 设置表字段值自动增加(AUTO_INCREMENT)
AUTO_INCREMENT是MySQL唯一扩展的完整性约束,当向数据库表中插入新记录时,字段上的值会自动生成唯一的ID。在具体设置AUTO_INCREMENT约束时,一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。由于设置AUTO_INCREMENT约束后的字段会生成唯一的ID,因此该字段也经常会同时设置成PK主键。
设置表中某字段值的自动增加约束非常简单,查看帮助文档发现,可以在MySQL数据库管理系统中通过SQL语句AUTO_INCREMENT来实现,其语法形式如下:

在上述语句中,tablename参数表示所要设置非空约束的字段名字,propName参数为属性名,propType为属性类型,propName字段要设置自动增加约束。默认情况下,字段propName的值从1开始增加,每增加一条记录,记录中该字段的值就会在前一条记录的基础上加1。
【示例3-25】执行SQL语句AUTO_INCREMENT,在数据库school中创建表t_class时设置字段classno为AUTO_INCREMENT和PK约束。具体操作如下:
创建表t_class,再查看t_class表信息,具体SQL语句如下,执行结果如图3-75、图3-76所示。


图3-75 创建表t_class

图3-76 查看表t_class
从图3-76中可以看出,表t_class中的字段classno已经被设置为AUTO_INCREMENT和PK约束。
3.8.6 设置表字段的外键约束(FOREIGN KEY,FK)
外键是表的一个特殊字段,外键约束是为了保证多个表(通常为两个表)之间的参照完整性,即构建两个表的字段之间的参照关系。
设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。例如,表示一个班级和学生关系,即每个班级有多个学生。首先应该有两个表:班级表和学生表,然后学生表有一个表示班级编号的字段classno,其依赖于班级表的主键,这样字段classno就是学生表的外键,通过该字段班级表和学生表建立了关系。
在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为空(NULL)。
设置表中某字段的FK约束非常简单,可以在MySQL数据库管理系统中通过SQL语句FOREIGN KEY来实现,其语法形式如下:

其中,tablename_1参数是要设置外键的表名,propName1_1参数是要设置外键的字段,tablename_2是父表的名称,propName2_1是父表中设置主键约束的字段名。
【示例3-26】执行SQL语句FOREIGN KEY,在数据库school中创建班级表(t_class)和学生表(t_student),设置学生表字段classno为外键约束,表示一个班级有多个学生的关系。具体步骤如下:
(1)创建和查看表t_class,具体SQL语句如下,执行结果如图3-77、图3-78所示。


图3-77 创建表t_class

图3-78 查看表t_class
(2)创建和查看表t_student,具体SQL语句如下,执行结果如图3-79、图3-80所示。


图3-79 创建表t_student

图3-80 查看表t_students
提示
在具体设置外键时,子表t_student中所设外键字段的数据类型必须与父表t_class中所参考的字段的数据类型一致,例如两者都是INT类型,否则就会出错。
3)从图3-80可以看出,表t_student中字段classno已经被设置成FK约束。如果在用户插入的记录中该字段上没有参考父表t_class中字段classno的值,那么数据库管理系统会报错误,如图3-81所示。

图3-81 插入数据
从图3-81中可以看出,表t_class中有一条数据,classno的值为1;向表t_student中插入一条数据记录,classno为2,数据库系统报错;向表t_student中插入一条数据记录,classno为1,插入数据成功。