MySQL 8 DBA基础教程
上QQ阅读APP看书,第一时间看更新

4.6 操作表的约束

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

表4-1 完整性约束条件

从表4-1中可以看出,MySQL数据库系统不支持check约束。根据约束数据列限制,约束可分为:单列约束,每个约束只约束一列数据;多列约束,每个约束可约束多列数据。

4.6.1 设置表字段的非空约束

当数据库表中的某个字段上的内容不希望设置为NULL时,则可以使用非空(NOT NVLL,NK)约束进行设置。非空约束在创建数据库表时为某些字段上加上NOT NULL约束条件,保证所有记录中该字段都有值。如果用户插入的记录中该字段为空值,数据库管理系统就会报错。

设置表中某字段的非空约束非常简单,查看帮助文档可以发现,在MySQL数据库管理系统中,通过SQL语句NOT NULL即可实现,其语法形式如下:

     CREATE TABLE tablename (
         PropName propType NOT NULL,
         ……);

在上述语句中,tablename参数表示所要设置非空约束的字段名字,propName参数为属性名,propType为属性类型。

【示例4-15】执行SQL语句NOT NULL,在数据库school中创建表t_class时,设置classno为非空约束,具体步骤如下:

步骤01 执行SQL语句CREATE DATABASE,创建数据库school,并选择该数据库,具体SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-78和图4-79所示。

图4-78 创建数据库

图4-79 选择数据库

步骤02 创建表t_class,具体SQL语句如下:

     CREATE TABLE `t_class` (
         `classno` INT(11) NOT NULL,
         `cname` VARCHAR(20),
         `loc` VARCHAR(40),
         `stucount` INT(11));

执行结果如图4-80所示。

步骤03 为了检验数据库school中的t_class表中的字段classno是否被设置为非空约束,执行SQL语句DESCRIBE,具体SQL语句如下:

     DESCRIBE t_class;

执行结果如图4-81所示。

图4-80 创建表t_class

图4-81 查看表信息

4.6.2 设置表字段的默认值

当为数据库表中插入一条新记录时,如果没有为某个字段赋值,那么数据库系统会自动为这个字段插入默认值。为了达到这种效果,可通过SQL语句关键字DEFAULT来设置。

设置数据库表中某字段的默认值非常简单,在MySQL数据库管理系统中通过SQL语句DEFAULT即可实现,其语法形式如下:

     CREATE TABLE tablename (
         propName propType DEFAULT defaultValue,
         ……
     );

在上述语句中,tablename参数表示所要设置非空约束的字段名字,propName参数为属性名,propType为属性类型,defaultValue为默认值。

【示例4-16】执行SQL语句DEFAULT,在数据库school中创建表t_class时设置cname字段的默认值为“class_3”,具体步骤如下:

步骤01 创建并选择数据库school,具体SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-82和图4-83所示。

图4-82 创建数据库

图4-83 选择数据库

步骤02 创建表t_class,字段cname的默认值为“class_3”,再查看t_class表的信息,具体SQL语句如下:

     CREATE TABLE `t_class` (
         `classno` INT(11) NOT NULL,
         `cname` VARCHAR(20) DEFAULT 'class_3',
         `loc` VARCHAR(40),
         `stucount` INT(11));

执行结果如图4-84和图4-85所示。

图4-84 创建表t_class

图4-85 查看表信息

从图4-85可以看出,表t_class中的字段cname已经设置了默认值,如果用户插入新的记录中该字段为空值,数据库管理系统就会自动插入值“class_3”。

4.6.3 设置表字段唯一约束(UNIQUE,UK)

当数据库表中某个字段上的内容不允许重复时,可以使用唯一(UNIQVE,UK)约束进行设置。唯一约束在创建数据库时为某些字段加上UNIQUE约束条件,保证所有记录中该字段的值不重复。如果用户插入的记录中,该字段的值与其他记录中该字段的值重复,数据库管理系统就会报错。

设置表中某字段的唯一约束非常简单,在MySQL数据库管理系统中通过SQL语句UNIQUE即可实现,其语法形式如下:

     CREATE TABLE tablename(
         propName propType UNIQUE,
         ……
     );

在上述语句中,tablename参数表示所要设置非空约束的字段名字,propName参数为属性名,propType为属性类型,propName字段要设置唯一约束。

【示例4-17】执行SQL语句UNIQUE,在数据库school中创建表t_class时,设置cname字段为唯一约束,具体步骤如下:

步骤01 创建和选择数据库school,具体SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-86和图4-87所示。

图4-86 创建数据库

图4-87 选择数据库

步骤02 创建表t_class,再查看t_class表的信息,具体SQL语句如下:

     CREATE TABLE `t_class` (
         `classno` INT(11) NOT NULL,
         `cname` VARCHAR(20) UNIQUE,
         `loc` VARCHAR(40),
         `stucount` INT(11));

执行结果如图4-88和图4-89所示。

图4-88 创建表

图4-89 查看表信息

步骤03 从图4-89可以看出,表t_class中的字段cname已经被设置为非空约束,如果用户插入的记录中,该字段有重复值,数据库管理系统就会报如下错误(见图4-90):

     ERROR 1062 (23000): Duplicate entry 'class_3' for key 'cname'

步骤04 如果想给字段cname上的唯一约束设置一个名字,可以执行SQL语句CONSTRAINT,创建表t_class,具体SQL语句执行结果如图4-91所示。

图4-90 UK字段插入重复数据出错

图4-91 创建表

图4-91所示创建表的效果和图4-88所示创建表的效果是一样的。

4.6.4 设置表字段的主键约束

主键是表的一个特殊字段。该字段能唯一地标识该表中的每条信息。主键和记录的关系如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证用来表明人的身份,每个人都具有唯一的身份证号。设置表的主键指在创建表时设置表的某个字段为该表的主键。

主键的主要目的是帮助数据库管理系统以最快的速度查找到表中的某一条信息。主键必须满足的条件就是主键必须是唯一的,表中任意两条记录的主键字段的值不能相同,主键的值是非空值。主键可以是单一的字段,也可以是多个字段的组合。

1.单字段主键

单字段主键语法规则如下:

     CREATE TABEL tablename(
         propName propType PRIMARY KEY
         ……);

其中,propName参数表示表中字段的名称,propType参数指定字段的数据类型。

【示例4-18】执行SQL语句PRIMARY KEY,在数据库school中创建表t_class时,设置classno字段为PK约束,具体步骤如下:

步骤01 创建和选择数据库school,具体SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-92和图4-93所示。

图4-92 创建数据库

图4-93 选择数据库

步骤02 创建表t_student,设置stuno字段为PK约束,再查看t_student表的信息,SQL语句如下:

     CREATE TABLE t_student(
         stuno INT PRIMARY KEY,
         sname VARCHAR(20),
         sage INT,
         sgender VARCHAR(4));
     DESCRIBE t_student;

执行结果如图4-94和图4-95所示。

图4-94 创建设置单一主键的表

图4-95 检验具有单一主键的表

步骤03 在表t_student中插入一组数据:

     INSERT INTO t_student VALUES(1,'Justin',20,'m');

结果如图4-96所示。

步骤04 在表t_student中插入一组重复主键的数据:

     INSERT INTO t_student values(1,'rebecca',32,'f');

提示出错,如图4-97所示。

图4-96 在表里插入数据

图4-97 在表里插入重复主键的数据

步骤05 在表t_student中插入一组不同主键的数据:

     INSERT INTO t_student values(2,'rebecca',32,'f');

操作成功,如图4-98所示。

图4-98 在表里插入不同主键的数据

步骤06 如果想给stuno字段的PK约束设置一个名字,可以执行SQL语句CONSTRAINT,创建表t_student_pk,如图4-99所示。再使用DESC语句查看表结构,如图4-100所示。

     CREATE TABLE t_student_pk(
        stuno INT,
        sname VARCHAR(20),
        sage INT(11),
        sgender VARCHAR(4),
        CONSTRAINT pk_stuno PRIMARY KEY(stuno));
     DESC t_student_pk;

图4-99 在表里设置约束标识符

图4-100 查看表结构

2.多字段主键

主键是由多个属性组合而成的,在属性定义完之后统一设置主键,语法规则如下:

     CREATE TABLE tablename(
        propName1 propType1,
        propName2 propType2,
        ……
     【CONSTRAINT PK_NAME】PRIMARY KEY(propName1, propName2));

【示例4-19】多字段主键的设置。

步骤01 创建和选择数据库school,SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-101和图4-102所示。

图4-101 创建数据库

图4-102 选择数据库

步骤02 创建表t_student_m_pk,设置stuno和sname字段为联合主键,再查看t_student_m_pk表的信息,具体SQL语句如下:

     CREATE TABLE t_student_m_pk(
         stuno INT,
         sname VARCHAR(20),
         sage INT(10),
         sgender VARCHAR(4),
         CONSTRAINT pk_stuno_sname PRIMARY KEY(stuno, sname));
     DESC t_student_m_pk;

执行结果如图4-103和图4-104所示。

图4-103 创建设置联合主键的表

图4-104 查看t_student_m_pk信息

步骤03 从图4-104中可以看出,stuno和sname已经被成功设置为联合主键,再向t_student_m_pk表中插入数据,SQL语句如下:

     INSERT INTO t_student values(1,'rebecca',32,'f');
     INSERT INTO t_student values(2,'rebecca',12,'f');
     INSERT INTO t_student values(1,jack,12,'f');
     INSERT INTO t_student values(1,'rebecca',12,'f');

执行结果如图4-105所示。

图4-105 创建设置联合主键的表

从图4-105中可以看到,向t_student_m_pk表中插入数据,如果有重复的联合主键,就会插入失败。

4.6.5 设置表字段值自动增加

AUTO_INCREMENT是MySQL唯一扩展的完整性约束,当为数据库表中插入新记录时,字段上的值会自动生成唯一的ID。在具体设置AUTO_INCREMENT约束时,一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。由于设置AUTO_INCREMENT约束后的字段会生成唯一的ID,因此该字段经常会同时设置成PK约束。

设置表中某字段值的自动增加约束非常简单,查看帮助文档发现,在MySQL数据库管理系统中通过SQL语句AUTO_INCREMENT即可实现,其语法形式如下:

     CREATE TABLE tablename(
         propName propType AUTO_INCREMENT,
         ……);

在上述语句中,tablename参数表示所要设置非空约束的字段名字,propName参数为属性名,propType为属性类型,propName字段要设置自动增加约束。默认情况下,字段propName的值从1开始增加,每增加一条记录,记录中该字段的值就会在前一条记录的基础上加1。

【示例4-20】执行SQL语句AUTO_INCREMENT,在数据库school中创建表t_class时,设置字段classno为AUTO_INCREMENT,并且为PK约束,具体步骤如下:

步骤01 创建和选择数据库school,SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-106和图4-107所示。

图4-106 创建数据库

图4-107 选择数据库

步骤02 创建表t_class,再查看t_class表信息,具体SQL语句如下:

     CREATE TABLE t_class(
         classno INT(11) PRIMARY KEY AUTO_INCREMENT,
         cname VARCHAR(20),
         loc VARCHAR(40),
         stucount INT(11));
     DESCRIBE t_class;

执行结果如图4-108和图4-109所示。

图4-108 创建和选择数据库

图4-109 创建表t_class

从图4-109中可以看出,表t_class中的字段classno已经被设置为AUTO_INCREMENT和PK约束。

4.6.6 设置表字段的外键约束

外键(FOREIGN KEY,FK)是表的一个特殊字段,外键约束用于保证多个表(通常为两个表)之间的参照完整性,即构建与两个表的字段之间的参照关系。

设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。例如,表示一个班级和学生的关系,即每个班级有多个学生,首先应该有两个表:班级表和学生表,然后学生表有一个表示班级编号的字段classno,其依赖于班级表的主键,这样字段classno就是学生表的外键,通过该字段,班级表和学生表建立了关系。

在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为空(NULL)。

设置表中某字段的FK约束非常简单,在MySQL数据库管理系统中通过SQL语句FOREIGN KEY即可实现,其语法形式如下:

     CREATE TABLE tablename_1(
         propName1_1 propType1_1,
         propName1_2 propType1_2,
         ……
         CONSTRAINT FK_prop FOREIGN KEY(propName1_1)
         REFERENCES tablename_2(propName2_1));

其中,tablename_1参数是要设置外键的表名,propName1_1参数是要设置外键的字段,tablename_2是父表的名称,propName2_1是父表中设置主键约束的字段名。

【示例4-21】执行SQL语句FOREIGN KEY,在数据库school中创建班级表(t_class)和学生表(t_student),设置学生表字段classno为外键约束,表示一个班级有多个学生的关系。具体步骤如下:

步骤01 创建和选择数据库school,SQL语句如下:

     CREATE DATABASE school;
     USE school;

执行结果如图4-110和图4-111所示。

图4-110 创建数据库

图4-111 选择数据库

步骤02 创建和查看表t_class,具体SQL语句如下:

     CREATE TABLE t_class(
         classno INT(11) PRIMARY KEY,
         cname VARCHAR(20),
         loc VARCHAR(40),
         stucount INT(11));
     DESCRIBE t_class;

执行结果如图4-112和图4-113所示。

图4-112 创建表t_class

图4-113 查看表t_class

步骤03 创建和查看表t_student,具体SQL语句如下:

执行结果如图4-114和图4-115所示。

图4-114 创建表t_student

图4-115 查看表信息

提示

在具体设置外键时,子表t_student中所设外键字段的数据类型必须与父表t_class中所参考的字段的数据类型一致,例如两者都是INT类型,否则就会出错。

步骤04 从图4-115可以看出,表t_student中的字段classno已经被设置成FK约束,如果用户插入的记录中,该字段上没有参考父表t_class中字段classno的值,数据库管理系统就会报如图4-116所示的错误。

图4-116 插入数据

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