第3章

MySQL表管理







本章首先介绍数据定义语言中的表管理。



微课视频


3.1关系模型的核心概念

在学习创建表之前,首先要熟悉关系模型中的一些核心概念。

英国科学家埃德加·弗兰克·科德在1976年6月发表了《关于大型共享数据库数据的关系模型》论文,首先概述了关系数据模型及其原理,并把它用于数据库系统中。

关系模型的数据结构是二维表组成的集合,每个二维表又称为关系,因此可以说关系模型是关系组成的集合。假设要设计一个校园管理系统的数据库。校园管理系统中会有很多实体,如学生、课程和学生成绩等,这些实体构成的集合就是表,也称为关系。表31所示为校园管理系统中的一个学生表(关系); 表32所示为校园管理系统中的课程表(关系); 表33所示为校园管理系统中的学生成绩表(关系)。


表31学生表




学号姓名身份证号码


9904047张烽51****************
9904048朱强51****************
9904049丁建辉31****************
9904050陈丹11****************





表32课程表




编号课程名任 课 教 师学时学分


A06017数据结构管老师515
A06021操作系统李老师646









表33学生成绩表




学号课 程 编 号成绩


9904047A0601792

9904047A0602189
9904048A0601784
9904049A0601787
9904049A0602190
9904050A0602188



3.1.1记录和字段

关系模型中的表是由若干行和列构成的,其中行称为元组,通常也称为记录; 而列是记录中的数据项,通常也称为字段(Fields)。

3.1.2键

关系模型的表结构中还有键(Key)的概念,也称为码。键又分为超键、候选键、主键和外键。

1. 超键

超键(Super Key,SK)也称为超码,能够唯一标识一行数据(记录)的字段或字段集。例如,表11所示的学生表中有3个字段,它们的组合有以下6种。

(1) (学号); 

(2) (学号,姓名); 

(3) (学号,身份证号码); 

(4) (姓名); 

(5) (姓名,身份证号码); 

(6) (身份证号码)。

由于超键要求能够唯一标识一行数据,且姓名字段是可以重复的,所以以下5种字段组合可以作为超键。

(1) (学号); 

(2) (学号,姓名); 

(3) (学号,身份证号码); 

(4) (姓名,身份证号码); 

(5) (身份证号码)。

这5种组合中的任意一种都可以标识一行数据,因此它们中的任意一种都可以称为超键。

2. 候选键

候选键(Candidate Key,CK)也称为候选码。候选键也属于超键,且是包含最少字段的超键,所以候选键是不含多余字段的超键,超键组合中去掉任意字段,就不再是超键了。所以,在学生表的5种超键中,有以下两种属于候选键。

(1) (学号); 

(2) (身份证号码)。

3. 主键

主键(Primary Key,PK)也称为主码。主键是从一组候选键中选择出来的,选择哪组候选键作为主键是由数据库设计人员决定的。在学生表中,推荐选择学号作为主键。



主键和候选键的区别在于: 一个表中只能有一个主键,但可以有多个候选键; 主键不能为空值(NULL),而候选键可以包含空值,如学生表的学号或身份证号码都可以作为候选键,但如果选择学号作为主键,就不能再选择身份证号码作为主键了。







主键和候选键有时可以是由多个字段组合而成的,如表13所示的学生成绩表,它的主键(学号,课程编号)是由两个字段组合而成的。




4. 外键

一个关系数据库可能包含多个表,可以通过外键(Foreign Key,FK)关联起来,外键也称为外码。例如,在校园管理系统中成绩表有以下两个外键。

(1) 学号: 详细信息存储在学生表中,它是学生表中的主键; 

(2) 课程编号: 详细信息存储在课程表中,它是课程表中的主键。

3.1.3约束条件

设计数据库表时,可以对表中的一个或多个字段的组合设置约束条件,检查该字段的输入值是否符合这个约束条件。约束分为表级约束和字段级约束,表级约束是对一个表中几个字段的约束,字段级约束则是对表中一个字段的约束。下面介绍几种常见的约束形式。

1. PRIMARY KEY约束

PRIMARY KEY即前面提到的主键,使用PRIMARY KEY约束可保证表中每条记录的唯一性。设计一个数据库表时,可以用一个或多个字段的组合作为这个表的主键。用单个字段作为主键时,使用了字段约束; 用多个字段的组合作为主键时,则使用了表级约束。

主键的功能是保证某个字段或多个字段组合以后的值是唯一的。如果将多个字段的组合定义为主键,则包含在该组合中的个别字段的值允许重复,但是这些字段组合后的值必须是唯一的。在录入数据的过程中,必须在主键字段中输入数据,即主键字段不接受空值。



空值(NULL)意味着用户还没有显式地为该字段输入数据,NULL既不等价于数值型数据中的0,也不等价于字符型数据中的空字符串或空格。不能把NULL视作大于、小于或等于任何其他值。




2. FOREIGN KEY约束

FOREIGN KEY即外键。外键字段的值必须在所引用的表中存在,所引用的表称为父表。父表通过主键字段或具有唯一性的字段与子表(包含外键表)的外键字段关联。

外键约束的主要作用是将彼此相关的表关联起来,以保证关联表之间的引用完整性。如果在外键字段中输入了一个非空值,但该值在所引用的表中并不存在,则这条记录也会被拒绝输入,因为这样输入将破坏关联表之间的引用完整性。

3. UNIQUE约束

如果希望表中的一个字段值不重复,则应当对该字段添加UNIQUE约束。与PRIMARY KEY约束不同的是,一个表中可以有多个UNIQUE约束,且应用UNIQUE约束的单个或多个字段允许接受NULL,候选键可以设置为UNIQUE约束。

4. CHECK约束

CHECK约束用于检查一个或多个字段的输入值是否满足指定的检查条件。在同一个字段上可以应用多个CHECK约束。在表中插入或修改数据时,CHECK约束便会发生作用,如果插入或修改数据以后,字段中的数据不再符合该约束指定的条件,则数据不能被写入字段。例如,学生成绩表中的成绩如果采用百分制,则其取值范围是大于或等于0且小于或等于100,那么就可以在学生成绩表中为成绩字段添加该约束。

5. DEFAULT约束

DEFAULT(默认值)约束用于指定一个字段的默认值,当尚未在该字段中输入数据时,该字段中将自动填入这个默认值。例如,学生表中的成绩字段如果设置默认值为0,那么在插入数据时,若不为成绩字段输入任何数据,则数据库系统会为该字段提供0值。



微课视频


3.2管理数据库

模式(Schema)是数据库中所有对象的集合,包括表、字段、视图、索引和存储过程等。



在MySQL中,模式就是数据库,即Database,为了防止概念混淆,本书将模式统称为数据库。




3.2.1创建数据库

在2.3.3节介绍了通过MySQL Workbench工具管理数据库(即Schema),这里不再赘述,本节重点介绍通过SQL代码创建数据库。通过SQL代码创建数据库的基本语法格式如下。

CREATE DATABASE db_name

创建数据库时,上面代码中的DATABASE可以换成SCHEMA。 

创建一个学校数据库(school_db)的示例代码如下。

-- 创建school_db数据库

CREATE DATABASE school_db ;

执行代码后会创建school_db数据库。SQL代码中的“”表示注释,它与注释内容之间会隔一个空格。

SQL代码执行过程可以参考2.3.5 节,这里不再赘述。

3.2.2删除数据库

有时候还需要删除数据库,删除数据库的基本语法格式如下。

DROP DATABASE db_name

删除学校数据库(school_db)的示例代码如下。

-- 删除数据库school_db

DROP DATABASE school_db ;


上述代码执行后,会删除school_db数据库,但是如果数据库不存在,则会发生如下错误。

Error Code: 1008. Can't drop database 'school_db'; database doesn't exist

使用MySQL Workbench工具执行上述SQL代码,结果如图31所示。



图31删除数据库执行结果


为了防止删除不存在的数据库而引发的错误,可以使用IF EXISTS子句判断数据库是否存在,修改代码如下。

-- 删除数据库school_db

DROP DATABASE IF EXISTS school_db;


3.2.3选择数据库

由于可以有多个数据库,不同的数据库中又有很多不同的对象,因此选择数据库也是非常重要的,选择数据库可以使用USE语句实现。

选择school_db数据库示例代码如下。

-- 选择使用school_db数据库

USE  school_db;


如图32所示的3个数据库都未被选中,现使用USE语句选择某个数据库,界面如图33所示,被选中的数据库会用加粗字体显示。



图323个数据库都未被选中





图33使用USE语句选中数据库后的界面




微课视频


3.3创建表

表管理包括创建表、修改表和删除表操作,本节介绍创建表。

在数据库中创建表可以使用CREATE TABLE语句。CREATE TABLE语句的基本语法格式如下。

CREATE TABLE table_name (

table_field1 datatype[(size)],

table_field2 datatype[(size)],

...

)


其中,table_name是表名,table_field1和table_field2等是表中的字段。表名和字段名是开发人员自定义的名称,但一般不推荐中文名称,如果有多个英文单词,推荐使用下画线分隔,如s_id和s_name。

语法结构中的datatype是字段的数据类型; size指定数据类型所占用的内存空间。注意语法结构中括号“[]”中的内容可以省略,因此[(size)]表示size是可以省略的。如果要定义多个字段,则字段之间要用逗号“,”分隔,但是最后一个字段之后要省略逗号。

下面通过示例介绍CREATE TABLE语句的使用。创建学生表,结构如表34所示。


表34学生表结构




字段名数 据 类 型长度备注


s_idINTEGER学号
s_nameVARCHAR(20)20姓名
genderCHAR(1)1性别,F表示女,M表示男
PINCHAR(18)18身份证号码



创建学生表的示例代码如下。

-- 3.3 创建表

--  创建学生表的语句

CREATE TABLE student(

s_id INTEGER,-- 学号①

s_nameVARCHAR(20),	-- 姓名②

genderCHAR(1),		-- 性别,'F'表示女,'M'表示男③

PINCHAR(18)-- 身份证号码④

)


由于创建表的语句属于DDL,因此建表的SQL文件扩展名可以为.ddl或.sql。它是一个文本文件,可以通过任意文本编辑工具进行编辑。这种文件通常可以通过数据库管理工具执行,因此也称为脚本文件。

代码第①行定义s_id字段,其中INTEGER指定字段为整数类型。

代码第②行定义s_name字段,其中VARCHAR(20)表示长度可变,且最大长度为20字节的字符串类型。

代码第③行定义gender字段,其中CHAR(1)表示固定长度为1字节的字符串类型,其取值为'F'或'M'。

代码第④行定义PIN字段,目前身份证号码为18位字符串,因此该字段数据类型设置为CHAR(18),表示固定长度为18位的字符串类型。



上述代码运行后会创建student表,但是如果没有使用USE语句选中数据库,也没有设置默认数据库,则会发生Error Code: 1046. No database selected错误。






微课视频


3.4字段数据类型

在创建表时,要求为每个字段指定具体的数据类型。关系数据共分为4种类型: 字符串数据、数值数据、日期和时间数据及大型对象数据。

3.4.1字符串数据

多数数据库都提供以下两种类型字符串数据。

(1) 固定长度(CHAR)字符串: 总是占据等量的内存空间,不管实际上它们存储的数据量有多少。

(2) 可变长度(VARCHAR): 可变长度的字符串只占据它们的内容所消耗的内存量。

例如,CHAR(2)表示固定两个字节长度的字符串,当只输入一个字节时,对于未占用的空间,数据库会用空格补位,使之能够始终保持两个字节的占位,这就是所谓的固定长度的字符串; VARCHAR(2)表示两个字节可变长度的字符串,当输入的字符串不足两个字节时,数据库不会补位。



如果不能确定字符串的长度,则可以使用TEXT类型,该类型可以存储大量文字数据。




3.4.2数值数据

多数数据库都提供至少两种类型数值数据: 整数(INTEGER)和浮点数(FLOAT或REAL)。

整数和浮点数可以统一用numeric[ (p[ ,s] )]表示。其中,numeric表示十进制数值数据; p为精度,即整数位数与小数位数之和; s为小数位数。此外,还有一些数据库提供更加独特的数字类型。

3.4.3日期和时间数据

多数关系数据库支持的另一种独特的数据类型是日期和时间数据。数据库处理日期和时间数据的方式有很多种,日期和时间数据中日期的存储和显示方法都可以变化,有些数据库还支持更多类型的时间数据。本质上,关系数据库所支持的3种类型日期和时间数据为日期、时间、日期+时间组合。

3.4.4大型对象

大多数数据库为字段提供大型对象类型数据,大型对象主要分为以下两种类型数据。

(1) 大文本(CLOB): 保存大量的文本数据。有的数据库中大文本可以容纳高达4GB的数据,有的数据库提供使用TEXT类型作为大文本数据类型。

(2) 大二进制(BLOB): 保存大量的二进制数据,如图片、视频等二进制文件数据。

3.5指定键

键是数据库的一种约束行为,它对于防止数据重复、保证数据的完整性是非常重要的。在定义表时可以指定键,包括候选键(CK)、主键(PK)和外键(FK)。



微课视频


3.5.1指定候选键

指定表的候选键使用UNIQUE关键字实现,语法格式有两种。

1. 在定义字段时指定

示例代码如下。

--  指定候选键

--  创建学生表语句

CREATE TABLE student(

s_id INTEGER,  -- 学号

s_nameVARCHAR(20), 		-- 姓名

genderCHAR(1) ,     	-- 性别, 'F'表示女, 'M'表示男

PINCHAR(18) UNIQUE -- 身份证号码①

)


代码第①行定义PIN字段,可见在定义PIN字段后面使用UNIQUE关键字,这样就将PIN字段指定为候选键了。

2. 在CREATE TABLE语句结尾处添加UNIQUE子句指定

示例代码如下。

--  指定候选键

--  创建学生表语句

CREATE TABLE student(

s_idINTEGER,-- 学号

s_nameVARCHAR(20), 	-- 姓名

gender  CHAR(1),       	-- 性别, 'F'表示女,'M'表示男

PIN     CHAR(18),      	-- 身份证号码

UNIQUE  (PIN)          	-- 定义身份证号码为候选键	①

)


代码第①行在CREATE TABLE语句结尾处添加UNIQUE子句(单独一行),注意它与其他字段定义语句用逗号分隔。

学生表创建完成后,可以使用MySQL Workbench工具测试候选键,如图34所示。试图通过INSERT语句插入两条数据,注意它们的PIN字段数据是重复的51***************3,会引发违反候选键约束错误Error Code: 1062. Duplicate entry '51***************3' for key 'student.PIN'。




图34测试候选键1



候选键可以是一个字段,也可以是多个字段的组合,上述示例介绍的是一个字段作为候选键的情况,下面再介绍多个字段组合作为候选键的示例,该示例是创建一个学生成绩表(student_score)。学生成绩表的相关信息如表35所示。


表35学生成绩表




字段名数 据 类 型长度是否候选键备注


s_idINTEGER是学号
c_idINTEGER是课程编号
scoreINTEGER否成绩



创建学生成绩表的示例代码如下。

--  指定多个字段组合候选键

--  创建学生成绩表语句

CREATE TABLE student(

s_idINTEGER, -- 学号

c_id    INTEGER,       -- 课程编号

score   INTEGER,       -- 成绩

UNIQUE  (s_id,c_id)    -- 定义多字段组合候选键①

)


代码第①行指定s_id和c_id字段为组合候选键。

学生成绩表创建完成之后,可以测试候选键,使用MySQL Workbench工具测试候选键,试图通过INSERT语句插入数据,如图35所示,如果候选键有重复数据,则会引发错误Error Code: 1062.Duplicate entry '1002' for key 'student_score.s_id'。




图35测试候选键2




微课视频


3.5.2指定主键

可以使用PRIMARY KEY关键字指定主键,它可以与UNIQUE关键字一起用在CREATE TABLE语句中。指定主键的方法也有两种。

1. 定义字段时指定

示例代码如下。

--  指定主键

--  创建学生表语句

CREATE TABLE student(

s_id INTEGER PRIMARY KEY,  -- 学号①

s_nameVARCHAR(20), 

 

s_name  VARCHAR(20), 

gender	CHAR(1), 

PIN		UNIQUE CHAR(18)) UNIQUE

)


代码第①行定义s_id字段,可见在定义s_id字段后面使用PRIMARY KEY关键字,就可以将s_id字段指定为主键了。

2. 在CREATE TABLE语句结尾处添加PRIMARY KEY子句指定

示例代码如下。

--  指定主键

--  创建学生表语句

CREATE TABLE student (

s_idINTEGER ,  -- 学号

s_name  VARCHAR(20), 

gender  CHAR(1), 

PINCHAR(18) UNIQUE, ①

PRIMARY KEY(s_id) ②

)


代码第①行指定候选键,代码第②行指定主键。主键和候选键都可以防止数据重复,读者可以参考候选键测试方法测试,这里不再赘述。

主键也可以是一个字段或多个字段的组合。修改学生成绩表,如表36所示,学生成绩表的主键是由s_id和c_id两个字段组合而成的。


表36学生成绩表




字段名数 据 类 型长度是 否 主 键备注


s_idINTEGER是学号
c_idINTEGER是课程编号
scoreINTEGER否成绩



创建学生成绩表代码如下。

--  指定主键

--  创建学生成绩表语句

CREATE TABLE student_score(

s_idINTEGER,-- 学号

c_id    INTEGER,       		-- 课程编号

score   INTEGER,       		-- 成绩

PRIMARY KEY  (s_id,c_id)   	-- 定义多字段组合主键①

)


代码第①行指定s_id和c_id字段为主键。



微课视频


3.5.3指定外键

指定外键使用REFERENCES关键字实现。将表33所示的学生成绩表中的学号字段(s_id)引用到表31所示的学生表中的学号字段(s_id)。学生成绩表称为子表,学生表称为父表。



这种表之间的外键关联关系通过文字描述不够形象,在数据库设计中,这种关系可以通过ER(实体关系)图描述,如图36所示,学生成绩表有两个外键(学号和课程编号),学生成绩表通过学号关联到学生表。另外,学生成绩表通过课程编号关联到课程表。






图36ER图


指定外键的方法也有两种。

1. 在定义字段时通过REFERENCES关键字指定

示例代码如下。

--  指定外键

--  创建学生成绩表语句

CREATE TABLE student_score(

s_idINTEGER REFERENCES student(s_id), -- 学号①

c_id    INTEGER,                 -- 课程编号

score   INTEGER,                            	-- 成绩

PRIMARY KEY  (s_id,c_id)

)


代码第①行定义s_id字段。在定义s_id字段时,后面使用REFERENCES关键字指定外键关联的父表及字段,这里的s_id字段就是外键。

2. 在CREATE TABLE语句结尾处添加FOREIGN KEY子句指定

示例代码如下。

--  指定外键

--  创建学生成绩表语句

 

CREATE TABLE student_score(

s_idINTEGER ,-- 学号

c_id   INTEGER,                     -- 课程编号

score  INTEGER,                     -- 成绩

PRIMARY KEY  (s_id,c_id),

FOREIGN KEY (s_id) REFERENCES student(s_id)①

)


代码第①行是FOREIGN KEY子句,FOREIGN KEY关键字后面的(s_id)是指定表的外键。



微课视频


3.6其他约束

除了指定键约束外,还有指定默认值、禁止空值和设置CHECK约束等。

3.6.1指定默认值

在定义表时可以为字段指定默认值,使用DEFAULT关键字实现。例如,在定义学生表时,可以为性别字段设置默认值'F'。示例代码如下。

--  创建学生表

--  指定默认值

CREATE TABLE student(

s_id INTEGER, -- 学号

s_nameVARCHAR(20),    	-- 姓名

genderCHAR(1) DEFAULT 'F' ,	-- 性别,'F'表示女,'M'表示男,默认值为'F'①

PINCHAR(18) UNIQUE 				-- 身份证号码

)


代码第①行为性别(gender)字段设置默认值'F',表示默认为女性。当没有给性别字段提供数据时,数据库系统会为其提供默认值'F'。如图37所示,插入数据时,没有为性别(gender)字段提供数据,则系统会为其提供默认值'F'。



图37指定默认值执行结果



3.6.2禁止空值

有时输入空值会引起严重的程序错误,在定义字段时,可以使用NOT NULL关键字设置字段禁止输入空值。

示例代码如下。

--  创建学生表

--  禁止空值

CREATE TABLE student(

s_id INTEGER, -- 学号

s_name  VARCHAR(20) NOT NULL,		-- 姓名①

gender	CHAR(1) DEFAULT 'F' ,	-- 性别,'F'表示女,'M'表示男,默认值为'F'

PINCHAR(18) UNIQUE 		-- 身份证号码

)


代码第①行为姓名(s_name)字段设置禁止空值。插入数据时,如果没有为姓名(s_name)字段提供数据,则会引发错误Error Code: 1364.Field 's_name' doesn't have a default value。



3.6.3设置CHECK约束

CHECK关键字用来限制字段所能接收的数据。例如,在学生成绩表中可以限制成绩(score)字段的值为0~100。示例代码如下。

--  指定外键

--  创建学生成绩表语句

CREATE TABLE student_score(

s_idINTEGER REFERENCES student(s_id),  -- 学号

c_id    INTEGER,                                       -- 课程编号

score   INTEGER  CHECK (score >= 0 AND  score <= 100),  -- 成绩 ①

PRIMARY KEY  (s_id,c_id)

)


代码第①行在定义score字段时设置对该字段的限制,CHECK关键字后面的表达式“(score >= 0 AND  score <= 100)”是限制条件,其中>=和<=为条件运算符,AND为逻辑运算符,表示“逻辑与”,类似的还有OR表示“逻辑或”,NOT表示“逻辑非”。有关条件运算符和逻辑运算符将在第7章详细介绍。

学生成绩表创建完成后,可以测试CHECK约束,如图38所示。通过INSERT语句插入数据时,试图为score字段输入值-20,则会引发Error Code: 1136. Column count doesn't match value count at row 1错误。



图38CHECK约束执行结果




微课视频


3.7修改表

有时表建立后,由于某种原因需要修改表的结构或字段的定义。使用ALTER TABLE语句可以修改表的结构。下面介绍如何通过ALTER TABLE语句实现修改表名、修改字段名、添加字段和删除字段等操作。

3.7.1修改表名

修改表名的ALTER TABLE语句基本语法格式如下。

ALTER TABLE table_name 

RENAME TO  new_table_name

其中,table_name为要修改的表名,new_table_name为修改后的表名。




不同数据库中的ALTER TABLE语句的语法格式有很大的不同,上述ALTER TABLE语句语法格式主要支持Oracle和MySQL数据库。





示例代码如下。

--  修改表名

--  将表名student修改为stu_table

ALTER TABLE student RENAME TO stu_table;①


代码第①行将student表名修改为stu_table,如图39所示。



图39修改表名执行结果


3.7.2添加字段

有时表已经创建好了,甚至使用了一段时间,表中有了一些数据,这时如果删除表再新建,代价就很大。此时,可以使用ALTER TABLE语句中的ADD语句在现有表中添加字段,语法格式如下。


ALTER TABLE table_name ADD field_name datatype[(size)]


其中,table_name为要修改的表名,field_name为要添加的字段。

以下代码是在student表中添加两个字段。

--  在student表中添加birthday(生日)和phone(电话)字段

ALTER TABLE student ADDbirthday CHAR(10);①

ALTER TABLE student ADD     phone VARCHAR(20);					②


代码第①行在student表中添加birthday字段,代码第②行在student表中添加phone字段。在MySQL Workbench工具中执行上述SQL语句,结果如图310所示。



图310添加字段执行结果


3.7.3删除字段

既然可以在现有表中添加字段,当然也可以删除字段。可以使用ALTER TABLE语句的DROP COLUMN语句在现有表中删除字段,语法格式如下。

ALTER TABLE  table_name  DROP COLUMN field_name 

以下代码是从student表中删除birthday字段。

--  从student表中删除birthday字段

ALTER TABLE student DROP  COLUMN birthday;①


代码第①行从student表中删除birthday字段。在MySQL Workbench工具中执行上述SQL语句,结果如图311所示。




图311删除字段执行结果

3.8删除表

通过DROP TABLE 语句实现删除表,语法格式如下。

DROP TABLE [IF EXISTS] table_name

注意,中括号“[]”中的内容是可以省略的。

删除student表的示例代码如下。

--  删除student表

DROP TABLE student;①

上述代码执行结果如图312所示,可见student表被删除了。

但是如果要删除的表不存在,则将发生Error Code: 1051. Unknown table 'school_db.student'错误。

为了防止错误发生,可以增加IF EXISTS子句,示例代码如下。

DROP TABLE IF EXISTS student;

如果表不存在,上述示例代码执行时不会发生错误,但会出现警告:1051 Unknown table 'school_db.student',如图313所示。



图312删除表执行结果




图313表不存在时的执行结果


3.9动手练一练

1. 简答题

(1) 请简述表记录和字段。

(2) 请说明主键、候选键和外键的区别。

2. 选择题



下列哪些约束可以防止数据重复?()


A. UNIQUE约束B. FOREIGN KEY约束

C. PRIMARY KEY约束D. CHECK约束

3. 操作题

(1) 使用命令提示符工具登录MySQL数据库服务器,并创建MyDB数据库。

(2) 使用命令提示符工具登录MySQL数据库服务器,并在MyDB数据库中创建teacher表。