项目5〓学生管理数据库数据的操作 任务描述 (1) 虽然表已创建好,但它是空的,那么如何往表里添加数据?添加数据之后,又如何进行管理? (2) 在向表中操纵数据时,如何避免输入无效的数据? (3) 数据完整性有哪些类型?它们分别可以避免哪些类型的无效数据? (4) 如何在实际操作时实现数据完整性? 学习目标 (1) 掌握: 表数据的添加,数据完整性的实现。 (2) 理解: 数据完整性的概念和类型,约束的类型。 知识准备 视频讲解 5.1数据完整性概述 数据库中的数据是从外界输入的,在向数据库中添加、修改和删除数据时,难免会因手工输入而产生各种错误。如何保证和维护数据的正确性、一致性和可靠性,成为数据库系统关注的问题。利用约束、默认和规则来维护数据的完整性,可以避免大部分无效数据的产生。 5.1.1数据完整性的概念 数据完整性用于保证数据库中数据的正确性、一致性和可靠性,防止数据库中存在不符合语义规定的数据以及因错误信息的输入输出导致无效操作或产生错误信息。 5.1.2数据完整性的类型 1. 实体完整性 实体完整性又称为行完整性,规定表的每一行在表中是唯一的实体。实体完整性通过索引、PRIMARY KEY约束、UNIQUE约束或IDENTITY属性实现。如student表中sno(学号)的取值必须唯一,它唯一标识了相应记录所代表的学生。学生的姓名不能作为主键,因为完全可能存在两名学生同名同姓的情况。 2. 域完整性 域完整性又称为列完整性,保证指定列的数据具有正确的数据类型、格式和有效的数据范围。域完整性通过FOREIGN KEY约束、CHECK约束、DEFAULT约束、NOT NULL定义和规则实现。如学生的考试成绩必须为0~100,性别只能是“男”或“女”。 3. 参照完整性 参照完整性又称为引用完整性,是指两个表的主键和外键的数据应对应一致。它确保了有主关键字的表中对应其他表的外关键字的行存在,即保证了表之间的数据的一致性。参照完整性是建立在外关键字和主关键字之间或外关键字和唯一性关键字之间的关系上的,包含外关键字的表称为从表,被从表引用或参照的表称为主表。参照完整性的作用体现在几个方面: 若主表中无关联的记录时,则不能将记录添加或更改到相关表中; 若可能导致相关表中生成孤立记录时,则不能更改主表中的该值; 若存在与某记录匹配的相关记录时,则不能从主表中删除该记录。例如学生学习课程的课程号必须是有效的课程号,score(成绩)表的外键cno(课程号)将参考course(课程)表中主键cno(课程号)以实现数据完整性。 视频讲解 5.2实现约束 约束是强制数据完整性的首选方法。约束是通过限制列中数据、行中数据以及表之间数据取值从而实现数据完整性的方法。定义约束可以在创建表时设置,也可以在修改表时添加约束。 5.2.1PRIMARY KEY(主键)约束 PRIMARY KEY约束在表中定义一个主键,唯一地标识表中的行。一个表应有一个PRIMARY KEY约束,且只能有一个PRIMARY KEY约束。PRIMARY KEY约束中的列不能接受空值和重复值。 若已有PRIMARY KEY约束,要将新列作为主键,则必须先删除现有的PRIMARY KEY约束,然后再创建新的主键; 当PRIMARY KEY约束由另一个表的FOREIGN KEY约束引用时,不能删除被引用的PRIMARY KEY约束,要删除它,必须先删除引用的FOREIGN KEY约束。主键可以是一列,也可以是多列组合的复合主键。 5.2.2DEFAULT(默认值)约束 DEFAULT约束是在用户未提供某些列的数据时,数据库系统为用户提供的默认值。 表的每一列都可以包含一个DEFAULT定义。可以修改或删除现有的DEFAULT定义,但必须先删除已有的DEFAULT定义,然后通过新定义重新创建。默认值必须与DEFAULT定义适用的列的数据类型一致,每一列只能定义一个默认值。 5.2.3CHECK约束 CHECK约束是限制用户输入某一列的数据取值,即该列只能输入一定范围的数据。也就是只有符合CHECK约束条件的数据才能输入。CHECK约束可以作为表定义的一部分在创建表时创建,也可以添加到现有表中。在一个表中可以创建多个CHECK约束,在一列上也可以创建多个CHECK约束。 5.2.4UNIQUE约束 由于一个表只能定义一个主键,而在实际应用中,表中可能有多列的值需要是唯一的,可以使用UNIQUE约束确保在非主键列中不输入重复值。要强制一列或多列组合(不是主键)的唯一性时应使用UNIQUE约束。与PRIMARY KEY约束不同的是,一个表可以定义多个UNIQUE约束,允许列为空值,但空值只能出现一次。 5.2.5NOT NULL约束 在设计表时,表中的列可以定义为允许或不允许空值。如果允许某列可以不输入数据,则该列定义为NULL约束; 如果某列必须输入数据,则该列定义为NOT NULL约束。默认情况下,列允许为NULL。NULL通常表示值未知或未定义。NULL不同于零、空白或长度为零的字符串,NULL表示用户还没有为该列输入值。 5.2.6FOREIGN KEY约束 FOREIGN KEY约束用于强制实现参照完整性,保证了数据库中表数据的一致性和正确性。FOREIGN KEY约束可以规定表中的某列参照同一个表或另外一个表中已有的PRIMARY KEY约束或UNIQUE约束的列。FOREIGN KEY约束可以在创建表时创建,也可以向现有表添加FOREIGN KEY约束。一个表可以有多个FOREIGN KEY约束。 任务实施 5.3使用图形化管理工具操作学生管理数据库表数据 5.3.1插入学生管理数据库表数据 视频讲解 【例51】假设学生管理数据库studb存在,其中的student表中的结构如图51所示,先建立student表,使用Navicat图形化管理工具向student表中插入如表51所示的数据(假设student表已创建好)。 图51student表结构 表51student表中插入的数据 stuidstunamesexagemajor 2210001张白男19计算机网络技术 2210002李小红女18软件技术 2210003王文男19计算机应用技术 操作步骤如下。 (1) 启动Navicat图形化管理工具,连接mytest服务器,双击studb数据库,使其处于打开状态,在studb数据库下单击“表”节点,在对象窗口中选中student表,如图52所示。 图52选中student表 (2) 单击工具栏中的“打开表”按钮,打开编辑窗口,将表51里的数据添加到student表中,如图53所示。 图53插入数据 (3) 当数据录入完毕后,单击状态栏中的“√”按钮完成保存。 5.3.2删除学生管理数据库表数据 在使用过程中,表中的一些数据可能不再需要,这时可以将其删除。 【例52】 使用Navicat图形化管理工具 删除student表中学号为2210003同学的信息。 操作步骤如下。 (1) 启动Navicat图形化管理工具,连接mytest服务器,双击studb数据库,使其处于打开状态,在studb数据库下单击“表”节点,在对象窗口中双击student表,打开student表。 (2) 定位学号为2210003的记录行,单击该行最前面的黑色箭头,选择该行后,右击,在弹出的快捷菜单中选择“删除记录”命令,如图54所示。 图54选择“删除记录”命令 (3) 弹出一个“确认删除”对话框,单击“删除一条记录”按钮,删除所选行。 5.3.3修改学生管理数据库表数据 【例53】 使用Navicat图形化管理工具 修改student表中学号为2210002同学的信息,将age修改为19。 操作步骤如下。 (1) 启动Navicat图形化管理工具,连接mytest服务器,双击studb数据库,使其处于打开状态,在studb数据库下单击“表”节点,在对象窗口中双击student表,打开student表。 (2) 直接在学号为2210002同学的age字段中修改,将18修改为19,如图55所示。 图55修改表中数据 (3) 单击状态栏中的“√”按钮完成保存。 5.4使用语句操作学生管理数据库表数据 对表数据的操作除了使用Navicat图形化管理工具外,还可以使用SQL语句。 5.4.1插入学生管理数据库表数据 1. 使用INSERT语句向表中插入数据 通过INSERT语句可以向表中添加一行或多行数据,语法格式如下: INSERT INTO 表名 [(字段列表)] VALUES (值列表1)[(值列表2), …(值列表n)]; 语法说明如下。 (1) 表名: 指定插入新数据的表的名称。 (2) 字段列表: 指定数据表的列名,必须用圆括号将字段列表括起来,当指定多个列时,各列之间用逗号隔开; 当向表中的所有字段插入数据时,字段列表可以省略。 (3) 值列表: 指定插入的新数据值。[(值列表2),…(值列表n)]为可选项,表示多条记录对应的数据。每个值列表都必须用圆括号括起来,列表间用逗号分隔。 重要提示: 在插入数据时要注意:  数据值的数量和顺序必须与字段名列表中的数量和顺序一样。  数据值的数据类型必须与表的列中的数据类型匹配,否则插入失败。  数据值如果采用默认值则写DEFAULT; 如果是空值则写NULL。  插入数据类型如果是字符型、日期型,则必须用单引号。 视频讲解 1) 向表中的部分列插入数据 【例54】使用SQL语句向学生管理数据库studb的student表中插入一条新数据,其中stuid为2210004,stuname为“白林”,sex为“女”。 打开MySQL 8.0 Command Line Client,输入以下语句: INSERT INTO student(stuid,stuname,sex) VALUES('2210004','白林','女'); 执行结果如图56所示。 图56添加一条数据的执行结果 2) 向表中的所有列插入数据。 【例55】使用SQL语句向学生管理数据库studb的student表中插入一条新数据,其中stuid为2210005,stuname为“杨辰”,sex为“男”,age为19,major为NULL。 打开MySQL 8.0 Command Line Client,输入以下语句: INSERT INTO student VALUES('2210005','杨辰','男',19,NULL); 执行结果如图57所示。 图57向表中的所有列添加数据 3) 向表中插入多条数据 【例56】使用SQL语句向学生管理数据库studb的student表的部分列插入三条新数据。 打开MySQL 8.0 Command Line Client,输入以下语句: INSERT INTO student(stuid,stuname,sex,age) VALUES('2210006','张鹏','男',19), ('2210007','刘刚','男',20), ('2210008','苏宏','女',18); 执行结果如图58所示。 图58向表中部分列添加三条数据 2. 使用INSERT…SELECT语句插入数据 使用INSERT…SELECT语句可以将某一个表中的数据插入另一个新数据表中,语法格式如下: INSERT INTO 目标数据表名 (字段列表1) SELECT 字段列表2 FROM 源数据表名 WHERE 条件表达式; 语法说明如下。 (1) 目标数据表名: 指定要插入的新表名称。 (2) SELECT: 用于检索数据。 (3) 字段列表2: 要检索的列表。该列与INSERT中的字段列表1的数量和顺序必须相同,列的数据类型和长度相同或者可以进行转换。 (4) 源数据表名: 表的名称。该表必须是已存在的表。 (5) 条件表达式: 指定插入的数据应满足的条件。 【例57】使用SQL语句将student表中性别是“男”的同学记录插入student_copy表中。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE student_copy (学号 char(12)NOT NULL, 姓名 char(10), 性别 char(2) ); 用INSERT INTO语句向student_copy表中插入数据: INSERT INTO student_copy SELECT stuid,stuname,sex FROM student WHERE sex='男'; 执行结果如图59所示。 图59创建表并添加数据 5.4.2修改学生管理数据库表数据 在使用过程中,根据实际情况有时需要修改表中的数据,修改数据的语法格式如下: UPDATE表名 SET 字段名1=值1,字段名2=值2,…,字段名n=值n [WHERE 条件表达式]; 语法说明如下。 (1) UPDATE: 修改数据的关键字。 (2) 表名: 指定要修改数据的表名。 (3) SET 字段名1=值1: 指定要更新的列及该列的新值。 (4) 条件表达式: 指定被更新的记录应满足的条件。 【例58】使用SQL语句将student表中学号为2210005的age由19修改为18。 打开MySQL 8.0 Command Line Client,输入以下语句: UPDATE student SET age=18 WHERE stuid='2210005'; 执行结果如图510所示。 【例59】使用SQL语句将student表中所有学生的major更新为“计算机网络技术”。 打开MySQL 8.0 Command Line Client,输入以下语句: UPDATE student SET major='计算机网络技术'; 执行结果如图511所示。 图510更新数据 图511更新数据 5.4.3删除学生管理数据库表数据 在MySQL中,使用DELETE语句可以删除表中的一行或多行数据,或者使用TRUNCATE语句删除表中的所有数据。 1. 使用DELETE语句删除数据 语法格式如下: DELETE FROM 表名 [WHERE 条件表达式]; 语法说明如下。 (1) 表名: 删除数据的表的名称。 (2) 条件表达式: 指定被删除的记录应满足的条件。若省略WHERE语句则删除表中所有的数据。 【例510】使用SQL语句删除student表中age为18的学生数据。 打开MySQL 8.0 Command Line Client,输入以下语句: DELETE FROM student WHERE age=18; 执行结果如图512所示。 图512删除数据 重要提示: 如果DELETE语句中没有WHERE子句的限制,则表中所有数据均被删除。 2. 使用TRUNCATE语句删除数据 使用DELETE语句删除记录时,若要删除表中的所有记录,且表中记录很多时,则删除命令执行较慢。在删除表中所有数据时,使用TRUNCATE TABLE语句速度更快。 语法格式如下: TRUNCATE TABLE 表名; 【例511】使用SQL语句删除student表中的所有数据。 打开MySQL 8.0 Command Line Client,输入以下语句: TRUNCATE TABLE student; 图513删除表中的所有数据 执行结果如图513所示。 说明: TRUNCATE TABLE在功能上与不带WHERE子句的DELETE语句相同; TRUNCATE语句不能带WHERE子句,所以它只能删除表中的所有数据; TRUNCATE语句删除表中的数据后,再向表中插入数据时,自动增加的字段默认初始值重新从1开始; 使用DELETE语句删除表中的所有数据后,再向表中插入数据时,自动增加的字段值会从记录中该字段最大值加1开始编号; DELETE语句每删除一行数据都会记录在系统操作日志中,TRUNCATE语句在删除数据时,不会在日志中记录删除的内容,无法恢复数据,所以在使用时需要慎重。 5.5实现学生管理数据库表约束 当定义了数据完整性约束,每次更新数据时,MySQL都会检验数据内容是否符合相应的完整性约束条件,只有符合完整性约束条件的数据才被允许更新。在定义约束前,应先确定约束的类型,不同类型的约束强制不同类型的数据完整性。约束可以使用Navicat图形化管理工具和SQL语句设置。 5.5.1PRIMARY KEY约束 1. 使用Navicat图形化管理工具设置PRIMARY KEY约束 【例512】使用Navicat图形化管理工具设置studb数据库中的student表中stuid字段为主键。 操作步骤如下。 (1) 启动Navicat图形化管理工具,连接mytest服务器,双击studb数据库,使其处于打开状态,在studb数据库下单击“表”节点,选中student表,在对象窗口中单击“设计表”。 (2) 选择stuid列,右击,从弹出的快捷菜单中选择“主键”命令,如图514所示。 图514设置主键 (3) 此时,该行的最后一列会出现一个“钥匙”图标,单击工具栏中的“保存”按钮,关闭窗口即可。 2. 使用SQL语句设置PRIMARY KEY约束 创建表时可通过定义PRIMARY KEY约束来创建主键。可以使用两种方式定义主键来作为列或表的完整性约束。作为列的完整性约束时,只需在列定义时加上关键字PRIMARY KEY。作为表的完整性约束时,需要在语句最后加上一条PRIMARY KEY(列名,…)语句。 视频讲解 【例513】在studb数据库中使用SQL语句创建teacher表,将teacid列定义为PRIMARY KEY约束。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE teacher( teacid char(10) PRIMARY KEY, teacname char(8), teacage int, department varchar(50)); 执行结果如图515所示。 图515成功设置PRIMARY KEY约束 上述SQL语句执行后,输入命令“DESC teacher;”可以看到teacid字段的Key值为PRI,PRI即主键的标识,如图516所示。 图516查看PRIMARY KEY 输入数据进行验证: INSERT INTO teacher VALUES('18302001','张阳',40,'人工智能学院'); 执行结果如图517所示。 图517添加一条数据 数据正常添加后,再输入同样的一条数据到teacher表,执行结果如图518所示。 图518违反PRIMARY KEY约束条件 添加失败,因为表中已有“18302001”这条数据,对于PRIMARY KEY约束来说,它是重复添加了,违反了PRIMARY KEY约束。 【例514】使用SQL语句在studb数据库中创建teac_course表,将teacid和cno设置为组合PRIMARY KEY约束。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE teac_course( teacid char(10), cno char(20), cname char(20), credit int, PRIMARY KEY (teacid,cno)); 执行结果如图519所示。 图519成功定义组合PRIMARY KEY约束 3. 为已存在的表设置PRIMARY KEY约束 语法格式如下: ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY; 【例515】使用SQL语句创建teacher2表,结构同teacher表,再将teacid设置为主键。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE teacher2 (teacid char(10), teacname char(8), teacage int, department varchar(50) ); 执行结果如图520所示。 图520创建teacher2表 修改teacher2表,为teacid设置主键。 ALTER TABLE teacher2 MODIFY teacid char(10) PRIMARY KEY; 执行结果如图521所示。 图521为teacid设置主键 4. 为已存在的表设置复合PRIMARY KEY约束 语法格式如下: ALTER TABLE 表名 ADD PRIMARY KEY(字段名1,字段名2); 【例516】使用SQL语句在studb数据库中创建teac_course1表,结构同teac_course表,再将teacid和cno设置为复合PRIMARY KEY约束。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE teac_course1( teacid char(10), cno char(20), cname char(20), credit int ); 执行结果如图522所示。 图522创建teac_course1表 修改teac_course1表,为teacid和cno设置复合PRIMARY KEY约束。 ALTER TABLE teac_course1 ADD PRIMARY KEY(teacid,cno); 执行结果如图523所示。 图523设置复合PRIMARY KEY约束 5. 删除PRIMARY KEY约束 语法格式如下: ALTER TABLE 表名 DROP PRIMARY KEY; 【例517】使用SQL语句删除teac_course1表的PRIMARY KEY约束。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE teac_course1 DROP PRIMARY KEY; 执行上述语句后,输入“DESC teac_course1;”语句验证,可以看到两个字段的Key值为NULL,PRIMARY KEY约束已被删除,如图524所示。 图524删除PRYIMARY KEY约束的执行结果 5.5.2DEFAULT约束 1. 使用Navicat图形化管理工具设置DEFAULT约束 【例518】使用Navicat图形化管理工具设置studb数据库中student表里的age默认值为18。 操作步骤如下。 (1) 启动Navicat图形化管理工具,连接mytest服务器,双击studb数据库,使其处于打开状态,在studb数据库下单击“表”节点,选中student表,在对象窗口中单击“设计表”。 (2) 选中age,在下方窗口中的“默认”文本框中输入“18”,如图525所示。 图525设置DEFAULT约束 (3) 单击工具栏中的“保存”按钮,完成DEFAULT约束的设置。 重要提示: 设置默认值为中文时需要给该中文默认值加一对英文的双引号。 2. 使用SQL语句在创建表时设置DEFAULT约束 语法格式如下: CREATE TABLE 表名(字段名 数据类型 数据长度 DEFAULT 默认值); 视频讲解 【例519】使用SQL语句在studb中创建course1表,结构与teac_course1表相同,并设置credit默认值为4。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE course1( teacid char(10), cno char(20), cname char(20), credit int DEFAULT 4 ); 执行结果如图526所示。 输入命令“DESC course1;”进行验证,credit的默认值(见Default列)已变为4,如图527所示。 图526设置DEFAULT约束 图527查看DEFAULT约束 3. 使用SQL语句为已存在的表设置DEFAULT约束 语法格式如下: ALTER TABLE 表名 MODIFY 字段名 数据类型 DEFAULT 默认值; 【例520】使用SQL语句修改studb数据库中的teacher表,设置teacage默认值为40。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE teacher MODIFY teacage int DEFAULT 40; 执行后输入命令“DESC teacher;”查看表结构,如图528所示。 图528设置并查看DEFAULT约束 4. 删除DEFAULT约束 语法格式如下: ALTER TABLE 表名 MODIFY 字段名 数据类型; 【例521】使用SQL语句删除teacher表中teacage字段设置的默认值。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE teacher MODIFY teacage int; 执行后并查看表结构,如图529所示。可以看到teacage字段的默认值已经没有了,表示删除成功。 图529删除DEFAULT约束 5.5.3CHECK约束 1. 创建表时设置CHECK约束 语法格式如下: CREATE TABLE 表名(字段名 数据类型 数据长度 CHECK(表达式)); 语法说明如下。 表达式: 指定需要检查的条件,在更新表数据时,MySQL会检查更新后的数据行是否满足CHECK约束的条件。 【例522】使用SQL语句在studb数据库中,创建student1表,结构与studb数据库中的student表结构相同,sex字段的取值范围是“男”或“女”。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE student1(stuid char(12), stuname char(10), sex char(2) CHECK(sex IN('男','女')), age int, major varchar(50)); 执行结果如图530所示。 图530设置CHECK约束 2. 为已存在的表设置CHECK约束 语法格式如下: ALTER TABLE 表名 ADD CHECK(表达式); 【例523】使用SQL语句设置studb数据库中course表的credit的值为1~5。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE course ADD CHECK(credit BETWEEN 1 AND 5); 执行结果如图531所示。 图531为已存在的表设置CHECK约束 说明: 在目前的MySQL版本中,CHECK约束还没有被强化,虽然可以被MySQL分析,但在更新数据时,CHECK约束并不起作用。 3. 删除CHECK约束 语法格式如下: ALTER TABLE 表名 DROP CHECK 检查约束名 【例524】使用SQL语句删除course表中credit字段的CHECK约束。 打开MySQL 8.0 Command Line Client,先查看系统自动生成的约束名,输入以下语句: SHOW CREATE TABLE course; 执行结果如图532所示,这里的CHECK约束名是course_chk_1。 图532查看CHECK约束名 输入以下语句删除CHECK约束: ALTER TABLE course DROP CHECK course_chk_1; 输入以下语句查看CHECK约束: SHOW CREATE TABLE course; 执行结果如图533所示。CHECK约束已被删除。 图533删除并查看CHECK约束 5.5.4UNIQUE约束 1. 创建表时设置UNIQUE约束 语法格式如下: CREATE TABLE 表名(字段名 数据类型 数据长度 UNIQUE); 【例525】使用SQL语句在studb数据库中创建student2表,结构与studb数据库中的student表结构相同,将stuname字段设置为唯一键。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE student2(stuid char(12), stuname char(10) UNIQUE, sex char(2), age int, major varchar(50)); 执行结果如图534所示。 图534创建表时设置UNIQUE约束 输入数据验证UNIQUE约束。 INSERT INTO student2 VALUES('2210010','黄顺','男',19,'软件技术'); 以上数据录入后,再添加一条数据到student2表。 INSERT INTO student2 VALUES('2210011','黄顺','女',18,'软件技术'); 执行结果如图535所示。 图535验证UNIQUE约束 第二条数据录入失败,因为stuname字段的值与上一条数据重复了,违反了stuname的UNIQUE约束。 2. 为已存在的表设置UNIQUE约束 语法格式如下: ALTER TABLE 表名 MODIFY字段名 字段类型UNIQUE; 【例526】使用SQL语句为student1表的stuname字段设置UNIQUE约束。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE student1 MODIFY stuname char(10) UNIQUE; 执行结果如图536所示。 图536为已存在的表设置UNIQUE约束 3. 删除UNIQUE约束 语法格式如下: ALTER TABLE 表名 DROP INDEX 约束名; 【例527】使用SQL语句删除student1表中stuname字段的UNIQUE约束。 打开MySQL 8.0 Command Line Client,先查看系统自动生成的约束名,输入以下语句: SHOW CREATE TABLE student1; 执行结果如图537所示,这里检查约束名是stuname。 图537查看UNIQUE约束名 输入以下语句删除检查约束: ALTER TABLE student1 DROP INDEX stuname; 执行上述语句后,输入命令“DESC student1;”进行验证,可以看到stuname字段的Key值为NULL,说明UNIQUE约束已被删除,如图538所示。 图538删除UNIQUE约束并查看 5.5.5NOT NULL约束 1. 创建表时设置NOT NULL约束 语法格式如下: CREATE TABLE 表名(字段名 数据类型 数据长度 NOT NULL); 视频讲解 【例528】使用SQL语句创建student3表,结构同student表,将字段stuname设置成NOT NULL约束。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE student3(stuid char(12), stuname char(10) NOT NULL, sex char(2), age int, major varchar(50)); 执行结果如图539所示。 图539创建表的同时设置NOT NULL约束 输入命令“DESC student3;”进行验证,验证结果如图540所示。 图540验证结果 可以看到,stuname字段的Null值为NO,说明该字段已被设置为NOT NULL约束。 2. 为已存在的表设置NOT NULL约束 语法格式如下: ALTER TABLE 表名 MODIFY 字段名 数据类型 数据长度 NOT NULL; 【例529】使用SQL语句为student2表的stuname字段设置NOT NULL约束。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE student2 MODIFY stuname char(10) NOT NULL; 执行上述语句后,输入命令“DESC student2;”进行验证,此时stuname字段的Null值为NO,如图541所示。 图541为已存在的表设置NOT NULL约束并查看 3. 删除NOT NULL约束 语法格式如下: ALTER TABLE 表名 MODIFY 字段名 数据类型; 【例530】使用SQL语句删除student2表的stuname字段的NOT NULL约束。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE student2 MODIFY stuname char(10); 执行上述语句后,输入命令“DESC student2;”进行验证,stuname字段的Null值为YES,说明NOT NULL约束已被删除,如图542所示。 图542删除NOT NULL约束并验证 5.5.6FOREIGN KEY约束 1. 使用Navicat图形化管理工具设置FOREIGN KEY约束 【例531】 使用Navicat图形化管理工具 在studb数据库中,设置course表的cno为外键,参考teac_course1表的cno。 操作步骤如下。 (1) 启动Navicat图形化管理工具,连接mytest服务器,双击studb数据库,使其处于打开状态,在studb数据库下单击“表”节点,选中course表,在对象窗口中单击“设计表”。 (2) 在“外键”标签中输入如图543所示的数据。 图543输入数据 (3) 单击“保存”按钮,完成设置。 2. 创建表时设置FOREIGN KEY约束 语法格式如下: CREATE TABLE 子表名 (字段名 字段类型 字段长度 FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <父表名> 主键列1 [,主键列2,… ); 【例532】使用SQL语句在studb数据库中创建teac_course_new表,设置teacid为外键,参考teacher表的teacid字段。 打开MySQL 8.0 Command Line Client,输入以下语句: CREATE TABLE teac_course_new( teacid char(10), teacname char(8) NOT NULL, cno char(20) NOT NULL, semester int, FOREIGN KEY(teacid) REFERENCES teacher(teacid)); 执行结果如图544所示。 图544设置FOREIGN KEY约束 验证FOREIGN KEY约束,先查询teacher表中的数据,结果如图545所示。 图545teacher表中的数据 在teac_course_new表中添加一条记录,如下: INSERT INTO teac_course_new VALUES('20302002','沈铭','202',3); 执行结果如图546所示。 图546验证FOREIGN KEY约束 数据录入失败,因为违反了外键参照完整性约束,teacid字段的取值“20302002”在teacher表中的teacid字段中不存在。 3. 为已存在的表设置FOREIGN KEY约束 语法格式如下: ALTER TABLE 子表名 ADD FOREIGN KEY(字段名) REFERENCES 父表(字段名); 【例533】使用SQL语句在studb数据库中将之前创建的teacher1表和teac_course1表 的teacid字段设置FOREIGN KEY约束。 打开MySQL 8.0 Command Line Client,输入以下语句: ALTER TABLE teac_course1 ADD FOREIGN KEY(teacid) REFERENCES teacher1(teacid); 执行结果如图547所示。 图547为已存在的表设置FOREIGN KEY约束 重要提示: 设置外键时,被引用表(主键表)必须设置了主键或唯一键,并且数据类型和长度必须与外键一致。 4. 删除FOREIGN KEY约束 语法格式如下: ALTER TABLE 子表名 DROP FOREIGN KEY 约束名; 【例534】使用SQL语句删除teac_course_new表teacid字段的FOREIGN KEY约束。 打开MySQL 8.0 Command Line Client,输入以下语句: SHOW CREATE TABLE teac_course_new; 查看FOREIGN KEY约束名为teac_course_new_ibfk_1,执行结果如图548所示。 图548查看FOREIGN KEY约束名 输入以下语句,删除FOREIGN KEY约束并查看: ALTER TABLE teac_course_new DROP FOREIGN KEY teac_course_new_ibfk_1; SHOW CREATE TABLE teac_course_new; 执行结果如图549所示。此时FOREIGN KEY约束已被删除,两个表之间没有了关联关系。 图549删除FOREIGN KEY约束并查看 任务实训营 1. 任务实训目的 (1) 掌握使用Navicat图形化管理工具向数据表中插入、删除和修改数据的方法。 (2) 掌握使用SQL语句向数据表中插入、删除和修改数据的方法。 (3) 掌握使用Navicat图形化管理工具和SQL语句两种方法来实现约束的方法。 2. 任务实训内容 (1) 使用Navicat图形化管理工具向studb学生管理数据库中的Department表插入数据,数据见表52。 表52向Department表中插入的数据 DepartIDDepartNameCharimanOffice 001信息技术系江波301 002艺术设计系马康302 003外语系李丽303 004体育系赵伟304 (2) 使用Navicat图形化管理工具删除Department表DepartID为001的数据。 (3) 使用SQL语句向Stu表插入数据,数据见表53。 表53向Stu表中插入的数据 StudentIDStudentNameSexAgeDepartID 22001李明男20001 22002王芳女19002 22003赵峰男19003 22004章雪女20004 (4) 使用SQL语句将Stu表中StudentID为22002学生的Age改为20。 (5) 使用SQL语句删除Stu表中StudentID为22001的数据。 (6) 使用SQL语句为Course表、Grade表添加数据,数据自定义。 (7) 为以上表添加如下约束,使用Navicat图形化管理工具和SQL语句两种方法实现。 ① NOT NULL约束: StudentName。 ② PRIMARY KEY约束: StudentID、DepartID。 ③ DEFAULT约束: Age字段默认为19。 ④ CHECK约束: Sex为“男”或“女”。 (8) 插入、修改和删除数据,体会数据完整性。 项目小结 本项目介绍数据表的定义、数据类型以及使用Navicat图形化管理工具和SQL语句 向表中 插入、删除和修改数据,介绍数据完整性的概念和类型,以及如何实现约束等。