MySQL数据库教程(第2版)-课件 第3章数据定义_第1页
MySQL数据库教程(第2版)-课件 第3章数据定义_第2页
MySQL数据库教程(第2版)-课件 第3章数据定义_第3页
MySQL数据库教程(第2版)-课件 第3章数据定义_第4页
MySQL数据库教程(第2版)-课件 第3章数据定义_第5页
已阅读5页,还剩82页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章数据定义学习目标掌握创建和管理数据库的相关语句。掌握创建和管理数据表的相关语句。掌握数据完整性约束的作用。掌握创建数据完整性约束的方法。3.1创建和管理数据库创建数据库是数据库实施阶段的第一步,管理数据库是为了有效地维护数据库,以确保数据库系统高效、稳定地运行。MySQL中的数据库可以用命令语句或者通过图形化的数据库工具(如NavicatforMySQL)来创建和管理。3.1.1创建数据库1.创建数据库的语句CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]数据库名[[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校对规则];(1){}为必选项;[]可选项;|用于分隔各个选项,表示只能选择其中一个。(2)IFNOTEXISTS:在创建数据库前进行判断,只有在不存在该数据库时才创建。(3)DEFAULT:指定数据库的默认字符集或校对规则。(4)CHARACTERSET子句:指定数据库的字符集。(5)COLLATE子句:指定字符集的校对规则。(6)语句以英文分号“;”结束。3.1.1创建数据库2.MySQL数据库中的字符集和校对规则字符集是一套符号和编码,用于定义数据的存储格式。例如,ASCII字符集定义了英文字符的存储格式。校对规则是在字符集上用于比较字符大小的一套规则。例如,英文字符在比较大小时是否区分大小写等。mysql>SHOWCHARACTERSET;+----------+---------------------------------+---------------------+--------+|Charset|Description|Defaultcollation|Maxlen|+----------+---------------------------------+---------------------+--------+|ASCII|USASCII|ASCII_GENERAL_CI|1||GB2312|GB2312SimplifiedChinese|GB2312_CHINESE_CI|2||GBK|GBKSimplifiedChinese|GBK_CHINESE_CI|2||UTF8MB3|UTF-8Unicode|UTF8MB3_GENERAL_CI|3||UTF8MB4|UTF-8Unicode|UTF8MB4_0900_AI_CI|4|+----------+---------------------------------+---------------------+--------+创建数据库举例【例3-1】创建一个名为scoredb的学生成绩管理数据库,采用MySQL数据库默认的字符集和校对规则。创建数据库的语句:CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]数据库名[[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校对规则];CREATEDATABASEscoredb;mysql>CREATEDATABASEscoredb;QueryOK,1rowaffected(0.01sec)创建数据库举例【例3-2】创建一个名为mytestdb的数据库,采用字符集GB2312和校对规则GB2312_CHINESE_CI。创建数据库的语句:CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]数据库名[[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校对规则];CREATEDATABASEmytestdbCHARACTERSETGB2312COLLATEGB2312_CHINESE_CI;mysql>CREATEDATABASEmytestdb->CHARACTERSETGB2312->COLLATEGB2312_CHINESE_CI;QueryOK,1rowaffected(0.01sec)创建数据库举例【例3-3】如果不存在数据库mytestdb,则创建该数据库。创建数据库的语句:CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]数据库名CREATEDATABASEIFNOTEXISTSmytestdb;mysql>CREATEDATABASEmytestdb;ERROR1007(HY000):Can’tcreatedatabase'mytestdb';databaseexistsmysql>CREATEDATABASEIFNOTEXISTSmytestdb;QueryOK,1rowaffected,1warning(0.01sec)mysql>SHOWWARNINGS;+-------+------+---------------------------------------------------+|Level|Code|Message|+-------+------+---------------------------------------------------+|Note|1007|Can'tcreatedatabase'mytestdb';databaseexists|+-------+------+---------------------------------------------------+3.1.2管理数据库1.显示数据库2.选择数据库3.修改数据库4.删除数据库1.显示数据库显示MySQL中的所有数据库的语句:SHOWDATABASES;4个系统数据库(1)information_schema:保存MySQL的元数据信息。(2)mysql:存储MySQL的用户及其访问权限等信息。(3)performance_schema:收集MySQL的性能数据。(4)sys:包含一系列的存储过程、存储函数和视图,主要作用是展示MySQL的各类性能指标。mysql>SHOWDATABASES;+--------------------+|Database|+--------------------+|information_schema||mysql||mytestdb||performance_schema||scoredb||sys|+--------------------+2.选择数据库在多数据库环境中,可以使用USE语句选择数据库,目的是告诉MySQL要使用哪个数据库,使其成为当前数据库。选择数据库的语句:USE数据库名;【例3-5】选择数据库scoredb作为当前数据库。

USEscoredb;mysql>USEscoredb;Databasechanged3.修改数据库修改数据库的语句:ALTER{DATABASE|SCHEMA}[数据库名][[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校对规则];【例3-6】修改数据库mytestdb的字符集为GBK,校对规则为GBK_CHINESE_CI。ALTERDATABASEmytestdbCHARACTERSETGBKCOLLATEGBK_CHINESE_CI;mysql>ALTERDATABASEmytestdb->CHARACTERSETGBK->COLLATEgbk_chinese_ci;QueryOK,1rowaffected(0.01

sec)4.删除数据库删除数据库的语句:DROP{DATABASE|SCHEMA}[IFEXISTS]数据库名;【例3-7】删除数据库mytestdb。

DROPDATABASEmytestdb;mysql>DROPDATABASEmytestdb;QueryOK,0rowaffected(0.02sec)3.2创建和管理数据表数据表是数据库中最重要和最基本的对象,是数据库中组织和存储数据的基本单位。建立数据库后,即可在数据库中创建数据表。3.2.1创建数据表1.MySQL支持的数据类型2.设计数据表3.创建数据表1.MySQL支持的数据类型MySQL支持的数据类型非常丰富,这里主要介绍常用的3种:(1)数值型(2)日期和时间型(3)字符串型(1)数值型数值型数据可以分为整数和实数两类。整数主要有TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT,默认情况下,整数都是有符号数,无符号数必须使用UNSIGNED显式地进行说明,如INTUNSIGNED。(1)数值型实数主要有FLOAT、DOUBLE和DECIMAL。其中,定点数的m表示总位数,d表示小数位数,且“总位数m=整数位数+小数位数d”。定点数适合对精度要求极高的场景。(2)日期和时间型日期和时间型数据主要有DATE、TIME、YEAR、DATETIME和TIMESTAMP。不同类型表示的日期和时间内容不同,取值范围不同,而且存储长度也可能不同。(3)字符串型有文本字符串和二进制字符串。文本字符串主要包括CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。其中,n表示可存储字符的个数,不区分中英文。CHAR是固定长度,在不指定n时,默认是CHAR(1)。VARCHAR是可变长度,必须指定n,n只是限制最多能存储的字符数,如果实际字符数小于n,则按实际存储。(3)字符串型二进制字符串主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。其中,m表示可存储的字节数。BINARY是固定长度,在不指定m时,默认占用1字节。VARBINARY是可变长度,必须指定m。m只是限制最多能存储的字节数,如果实际存储的字节数小于m,则按实际存储。2.设计数据表(1)确定数据表的名称。(2)设计数据表的结构。确定各个字段的字段名称、数据类型、是否允许空值、键和默认值等。3.创建数据表创建数据表的语句:CREATETABLE[IFNOTEXISTS]表名(字段名称1数据类型[约束][,字段名称2

数据类型[约束]…]);其中,约束包括是否允许空值、默认值、自增属性、主键、唯一约束等,具体参数如下。[NULL|NOTNULL][DEFAULT默认值][AUTO_INCREMENT][PRIMARYKEY][UNIQUE](1)NULL|NOTNULL:指定该字段是否允许空值。如果不指定,默认允许空值。(2)DEFAULT默认值:指定该字段的默认值。如果不指定,默认值为NULL。(3)AUTO_INCREMENT:指定该字段为自增字段。每插入一条记录,该字段的值自动增加1。(4)PRIMARYKEY:指定该字段为主键。主键既不允许空值,也不允许重复。(5)UNIQUE:指定该字段为唯一约束。唯一约束允许空值,但不允许重复。创建数据表举例【例3-8】在数据库scoredb中创建院系表department。创建数据表的语句:CREATETABLE[IFNOTEXISTS]表名(字段名称1数据类型[约束][,字段名称2数据类型[约束]…]);CREATETABLEdepartment(deptnoCHAR(3)NOTNULLPRIMARYKEY,deptnameVARCHAR(50)UNIQUE,directorVARCHAR(50)DEFAULT‘郑明'

);mysql>USEscoredb;Databasechangedmysql>CREATETABLEdepartment

->(->deptnoCHAR(3)NOTNULLPRIMARYKEY,->deptnameVARCHAR(50)UNIQUE,->directorVARCHAR(50)DEFAULT'郑明'->);QueryOK,0rowsaffected(0.01sec)创建数据表举例【例3-9】创建学生家庭情况表familyinfo。

mysql>CREATETABLEfamilyinfo->(->stunoCHAR(11)PRIMARYKEY,->stunameVARCHAR(50),->addressVARCHAR(50),->telephoneCHAR(11)->);QueryOK,0rowsaffected(0.01sec)CREATETABLEfamilyinfo(stunoCHAR(11)PRIMARYKEY,stunameVARCHAR(50),addressVARCHAR(50),telephoneCHAR(11));3.2.2管理数据表1.查看数据表2.修改数据表3.复制数据表4.删除数据表1.查看数据表(1)查看数据表的名称(2)查看数据表的基本结构(3)查看数据表的详细结构(1)查看数据表的名称语句格式:SHOWTABLES[{FROM|IN}数据库名];【例3-10】在数据库scoredb中查看已经创建好的数据表的名称。

SHOWTABLESFROMscoredb;或SHOWTABLES;mysql>SHOWTABLES;+-------------------+|Tables_in_scoredb|+-------------------+|department||familyinfo|+-------------------+(2)查看数据表的基本结构SHOWCOLUMNS语句:SHOWCOLUMNS{FROM|IN}表名[{FROM|IN}数据库名];DESCRIBE语句:{DESCRIBE|DESC}表名;【例3-11】查看院系表department的基本结构。SHOWCOLUMNSFROMdepartment;或DESCdepartment;

mysql>DESCdepartment;+----------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+----------+-------------+------+-----+---------+-------+|deptno|char(3)|NO|PRI|NULL|||deptname|varchar(50)|YES|UNI|NULL|||director|varchar(50)|YES||郑明||+----------+-------------+------+-----+---------+-------+3rowsinset(0.01sec)(3)查看数据表的详细结构语句格式:SHOWCREATETABLE表名;【例3-12】查看院系表department的详细结构。SHOWCREATETABLEdepartment;mysql>SHOWCREATETABLEdepartment;+------------+--------------------------------------------------------+|Table|CreateTable|+------------+--------------------------------------------------------+|department|CREATETABLE`department`(`deptno`char(3)NOTNULL,`deptname`varchar(50)DEFAULTNULL,`director`varchar(50)DEFAULT'郑明',PRIMARYKEY(`deptno`),UNIQUEKEY`deptname`(`deptname`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci|+------------+--------------------------------------------------------+1rowinset(0.02sec)2.修改数据表(1)修改数据表的名称(2)修改字段的数据类型(3)修改字段名称和数据类型(4)添加字段(5)删除字段(1)修改数据表的名称语句格式:ALTERTABLE原表名RENAME[TO]新表名;【例3-13】将学生家庭情况表familyinfo的名称修改为sfamily。

ALTERTABLEfamilyinfoRENAMEsfamily;mysql>ALTERTABLEfamilyinfoRENAMEsfamily;QueryOK,0rowsaffected(0.01sec)mysql>SHOWTABLES;+-------------------+|Tables_in_scoredb|+-------------------+|department||sfamily|+-------------------+2rowsinset(0.04sec)(2)修改字段的数据类型语句格式:ALTERTABLE表名MODIFY[COLUMN]字段名称新的数据类型;【例3-14】将学生家庭情况表sfamily中联系电话telephone字段的数据类型由CHAR(11)修改为VARCHAR(20)。ALTERTABLEsfamilyMODIFYtelephoneVARCHAR(20);mysql>ALTERTABLEsfamilyMODIFYtelephoneVARCHAR(20);mysql>DESCsfamily;+-----------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------+-------------+------+-----+---------+-------+|stuno|char(11)|NO|PRI|NULL|||stuname|varchar(50)|YES||NULL|||address|varchar(50)|YES||NULL|||telephone|varchar(20)|YES||NULL||+-----------+-------------+------+-----+---------+-------+(3)修改字段的名称和数据类型语句格式:ALTERTABLE表名CHANGE[COLUMN原字段名称新字段名称新数据类型;【例3-15】将学生家庭情况表sfamily中的联系电话字段名称由telephone修改为cellphone、数据类型修改回CHAR(11)。。

ALTERTABLEsfamilyCHANGEtelephonecellphoneCHAR(11);mysql>ALTERTABLEsfamilyCHANGEtelephonecellphoneCHAR(11);mysql>DESCsfamily;+-----------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------+-------------+------+-----+---------+-------+|stuno|char(11)|NO|PRI|NULL|||stuname|varchar(50)|YES||NULL|||address|varchar(50)|YES||NULL|||cellphone|char(11)|YES||NULL||+-----------+-------------+------+-----+---------+-------+(4)添加字段语句格式:ALTERTABLE表名ADD[COLUMN]新字段名称数据类型[约束][FIRST|AFTER已存在的字段名称];默认在最后面添加,FIRST指定为第一个字段,AFTER指定在某个字段之后添加。【例3-16】在学生家庭情况表sfamily中增加序号id字段(作为数据表中的第一个字段),数据类型为INT,唯一约束且字段值自动递增。ALTERTABLEsfamilyADDidINTUNIQUEAUTO_INCREMENTFIRST;mysql>ALTERTABLEsfamilyADDidINTUNIQUEAUTO_INCREMENTFIRST;mysql>DESCsfamily;+-----------+-------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-----------+-------------+------+-----+---------+----------------+|id|int|NO|UNI|NULL|auto_increment||stuno|char(11)|NO|PRI|NULL|||stuname|varchar(50)|YES||NULL|||address|varchar(50)|YES||NULL|||cellphone|char(11)|YES||NULL||+-----------+-------------+------+-----+---------+----------------+(5)删除字段语句格式:ALTERTABLE表名DROP字段名称;【例3-17】将学生家庭情况表sfamily中的序号id字段删除。

ALTERTABLEsfamilyDROPid;3.复制数据表(1)同时复制数据表的结构和数据(2)只复制数据表的结构(1)同时复制数据表的结构和数据语句格式:CREATETABLE新表名SELECT*FROM原表名;

不会复制原表的主键设置,因此在新表中需要单独设置主键。【例3-18】将学生家庭情况表sfamily的结构和数据复制到新表newfamily1中。。

CREATETABLEnewfamily1SELECT*FROMsfamily;

mysql>CREATETABLEnewfamily1SELECT*FROMsfamily;mysql>DESCnewfamily1;+-----------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------+-------------+------+-----+---------+-------+|stuno|char(11)|NO||NULL|||stuname|varchar(50)|YES||NULL|||address|varchar(50)|YES||NULL|||cellphone|char(11)|YES||NULL||+-----------+-------------+------+-----+---------+-------+(2)只复制数据表的结构(包括主键)语句格式:CREATETABLE新表名LIKE原表名;【例3-19】将学生家庭情况表sfamily的结构完整地复制到新表newfamily2中。。

CREATETABLEnewfamily2LIKEsfamily;mysql>CREATETABLEnewfamily2LIKEsfamily;mysql>DESCnewfamily2;+-----------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------+-------------+------+-----+---------+-------+|stuno|char(11)|NO|PRI|NULL|||stuname|varchar(50)|YES||NULL|||address|varchar(50)|YES||NULL|||cellphone|char(11)|YES||NULL||+-----------+-------------+------+-----+---------+-------+4.删除数据表语句格式:

DROPTABLE[IFEXISTS]表名1[,表名2…];【例3-20】将数据表newfamily1和newfamily2删除。

DROPTABLEnewfamily1,newfamily2;3.3数据完整性约束数据完整性指的是数据的一致性和准确性,只有符合数据完整性约束的数据才允许被插入、删除或修改。3.3.1数据完整性的概念(1)域完整性:数据表中各个字段的取值必须符合字段定义的数据类型。例如,如果字段的数据类型是整型,那么该字段就不能存储任何实数。(2)实体完整性:数据表中的每一条记录都必须是唯一的,即数据表的主键既不能重复也不能取空值,因此组成主键的每一个字段都不允许为空值。(3)参照完整性:两张相关联的数据表的主键和外键字段的数据必须一致,即一张表中外键字段的值要么为空值,要么是另一张表的主键字段中已经存在的值。(4)用户定义完整性:数据表中的各个字段的取值都必须满足特定应用场景对数据的要求。例如,学生表中性别字段的取值只能是“男”或“女”。3.3.2主键约束(PRIMARYKEY)1.在创建数据表时指定主键约束(1)在定义字段的同时指定单字段主键约束(2)在定义完所有字段后指定单字段主键约束或多字段组合主键约束2.在修改数据表时指定主键约束1.在创建数据表时指定主键约束(1)在定义字段的同时指定单字段主键约束字段名称数据类型PRIMARYKEY【例3-21】创建department1表,在定义院系代码deptno字段的同时指定其为主键约束,并且忽略其他约束。

CREATETABLEdepartment1(deptnoCHAR(3)PRIMARYKEY,deptnameVARCHAR(50),

directorVARCHAR(50));1.在创建数据表时指定主键约束(2)在定义完所有字段后指定单字段主键约束或多字段组合主键约束PRIMARYKEY(字段名称1[,字段名称2...])【例3-22】创建department2表,指定院系代码deptno字段和院系名称deptname字段的组合为主键约束,并且忽略其他约束。CREATETABLEdepartment2(deptnoCHAR(3),deptnameVARCHAR(50),

directorVARCHAR(50),PRIMARYKEY(deptno,deptname));2.在修改数据表时指定主键约束语句格式:ALTERTABLE表名ADDPRIMARYKEY(字段名称1[,字段名称2…]);【例3-23】先忽略所有约束创建数据表department3,然后在修改department3表时指定院系代码deptno字段为主键约束。CREATETABLEdepartment3(deptnoCHAR(3),

deptnameVARCHAR(50),directorVARCHAR(50));ALTERTABLEdepartment3ADDPRIMARYKEY(deptno);3.3.3唯一约束唯一约束和主键约束的区别如下。(1)一张数据表只能有一个主键约束,但可以有多个唯一约束。(2)主键约束不允许空值,唯一约束允许空值,且允许存在多个空值。1.在创建数据表时指定唯一约束(1)在定义字段的同时指定唯一约束

字段名称数据类型UNIQUE【例3-24】创建department4表,在定义字段的同时指定院系代码deptno字段为主键约束、院系名称deptname字段为唯一约束,并且忽略其他约束。CREATETABLEdepartment5(deptnoCHAR(3)PRIMARYKEY,deptnameVARCHAR(50)UNIQUE,directorVARCHAR(50));1.在创建数据表时指定唯一约束(2)在定义完所有字段后指定唯一约束[CONSTRAINT约束名称]UNIQUE(字段名称1[,字段名称2...])【例3-25】创建department5表,在定义完所有字段后指定院系代码deptno字段为主键约束、院系名称deptname字段为唯一约束,并且将唯一约束命名为constr1。

CREATETABLEdepartment5(deptnoCHAR(3),deptnameVARCHAR(50),directorVARCHAR(50),PRIMARYKEY(deptno),CONSTRAINTconstr1UNIQUE(deptname));2.在修改数据表时指定唯一约束语句格式:ALTERTABLE表名ADD[CONSTRAINT约束名称]UNIQUE(字段名称1[,字段名称2...]);【例3-26】修改数据表department1,指定院系名称deptname字段为唯一约束。ALTERTABLEdepartment1ADDUNIQUE(deptname);3.3.4外键约束(FOREIGNKEY)外键约束用于让两张相关联的数据表的主键和外键字段的值保持一致。简单来说,就是要求子表中每条记录的外键字段值要么为空值,要么是父表中已经存在的主键字段值。例如,学生表student表和院系表department之间存在一对多联系,父表是department,子表是student。因此,student表中院系代码101和103都必须是department表中已经存在的院系代码值。3.3.4外键约束(FOREIGNKEY)在指定外键约束时,需要满足下列条件。(1)父表必须是已经创建的数据表。(2)子表中外键字段的数据类型必须和父表中主键字段的数据类型相同。(3)父表和子表都必须使用InnoDB存储引擎,且采用相同的字符集和校对规则。1.在创建数据表(子表)时指定外键约束语句格式:[CONSTRAINT约束名称]FOREIGNKEY(子表字段名称1[,子表字段名称2...])REFERENCES父表名(父表字段名称1[,父表字段名称2...])[ONDELETE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}][ONUPDATE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}];(1)子表字段名称:子表中需要指定外键约束的字段的名称。(2)父表名:子表中外键所依赖的数据表的名称。(3)父表字段名称:父表中定义的主键,可以是单字段主键,也可以是多字段组合主键。(4)ONDELETE子句:为外键定义父表执行DELETE(删除)语句时的参照动作。(5)ONUPDATE子句:为外键定义父表执行UPDATE(修改)语句时的参照动作。RESTRICT(限制),CASCADE(级联),SETNULL(设置为空值),

NOACTION(不采取动作),SETDEFAULT(设置为默认值)1.在创建数据表(子表)时指定外键约束【例3-27】创建学生表student,在定义完所有字段后指定主键约束和外键约束,并且忽略其他约束。

CREATETABLEstudent(stunoCHAR(11),

stunameVARCHAR(50),

genderCHAR(1),birthdateDATE,classnoVARCHAR(20),deptnoCHAR(3),enterscoreINT,awardsTEXT,PRIMARYKEY(stuno),FOREIGNKEY(deptno)REFERENCES

department(deptno));1.在创建数据表(子表)时指定外键约束【例3-27】创建学生表student,在定义完所有字段后指定主键约束和外键约束,并且忽略其他约束。

CREATETABLEstudent(stunoCHAR(11),

stunameVARCHAR(50),

genderCHAR(1),birthdateDATE,classnoVARCHAR(20),deptnoCHAR(3),enterscoreINT,awardsTEXT,PRIMARYKEY(sno),FOREIGNKEY(deptno)REFERENCES

department(deptno));这里没有指定外键的参照动作,默认情况下。(1)不能在子表的外键字段中插入父表的主键字段中不存在的值。(2)如果子表中存在匹配的外键字段值,则不能从父表中删除该主键字段值。(3)如果子表中存在匹配的外键字段值,则不能在父表中修改该主键字段值。2.在修改数据表(子表)时指定外键约束语句格式:ALTERTABLE表名ADD外键约束;【例3-28】创建数据表student1(只包含学号stuno字段、姓名stuname字段、性别gender字段和院系代码deptno字段),指定stuno字段为主键约束,然后在修改student1表时指定外键约束。ALTERTABLEstudent1ADDFOREIGNKEY(deptno)REFERENCESdepartment(deptno)ONDELETESETDEFAULTONUPDATECASCADE;CREATETABLEstudent1(

stunoCHAR(11)PRIMARYKEY,

stunameVARCHAR(50),genderCHAR(1),deptnoCHAR(3));3.3.5检查约束(CHECK)对数据表中的某个字段或多个字段的值设置检查约束,目的是限定字段的取值范围。1.在创建数据表时指定检查约束(1)在定义字段的同时指定检查约束。

字段名称数据类型CHECK(表达式)【例3-29】创建数据表student2(只包含学号stuno、姓名stuname和性别gender),指定stuno字段为主键约束,并在定义字段的同时指定gender字段的检查约束为取值只能是“男”或“女”。

CREATETABLEstudent2(stunoCHAR(11)PRIMARYKEY,

stunameVARCHAR(50),

genderCHAR(1)CHECK(genderIN('男','女')));1.在创建数据表时指定检查约束(2)在定义完所有字段后指定检查约束。

[CONSTRAINT

约束名称]CHECK(表达式)【例3-30】创建数据表student3(只包含学号stuno、姓名stuname、性别gender和出生日期birthdate),指定stuno字段为主键约束,并在定义完所有字段后指定gender字段的检查约束为取值只能是“男”或“女”、birthdate字段的检查约束为取值只能在2000年1月1日及以后。CREATETABLEstudent3(

stunoCHAR(11)PRIMARYKEY,stunameVARCHAR(50),

genderCHAR(1),

birthdateDATE,CHECK(genderIN('男','女')),CHECK(birthdate>='2000-01-01')

);2.在修改数据表时指定检查约束语句格式:

ALTERTABLE表名ADD[CONSTRAINT约束名称]CHECK(表达式);【例3-31】针对已经创建的数据表student1,指定其性别gender字段的检查约束为取值只能是“男”或“女”。ALTERTABLEstudent1ADDCHECK(genderIN('男','女'));3.3.6非空约束(NOTNULL)用来指定字段的值不能为空值。对于指定了非空约束的字段,如果用户在插入数据时没有指定值,则数据库系统会报错。1.在创建数据表时指定非空约束语法格式:

字段名称数据类型NOTNULL【例3-32】创建数据表student4(只包含学号stuno、姓名stuname、性别gender和出生日期birthdate),指定stuno字段为主键约束,stuname字段为非空约束。CREATETABLEstudent4(stunoCHAR(11)PRIMARYKEY,stunameVARCHAR(50)NOTNULL,genderCHAR(1),birthdateDATE);2.在修改数据表时指定非空约束语句格式:ALTERTABLE表名MODIFY[COLUMN]字段名称数据类型NOTNULL;【例3-33】修改数据表student4,指定性别gender字段为非空约束。

ALTERTABLEstudent4MODIFYsexCHAR(1)NOTNULL;3.3.7默认值约束(DEFAULT)用来指定某个字段的默认值。例如,院系表department中将负责人director字段的默认值设置为“郑明”,这样在插入新院系时,如果没有给director字段赋值,系统将自动为其填充“郑明”这一默认值。1.在创建数据表时指定默认值约束语法格式:字段名称数据类型DEFAULT默认值【例3-34】创建数据表student5(只包含学号stuno、姓名stuname、性别gender和入学总分enterscore),指定stuno字段为主键约束,gender字段的默认值约束为“男”。CREATETABLEstudent5(

stunoCHAR(11)PRIMARYKEY,

stunameVARCHAR(50)),

genderCHAR(1)DEFAULT'男',

enterscoreINT);2.在修改数据表时指定默认值约束语句格式:ALTERTABLE表名MODIFY[COLUMN]字段名称数据类型DEFAULT默认值;【例3-35】修改数据表student5,指定入学总分enterscore字段的默认值约束为550。ALTERTABLEstudent5MODIFYenterscoreINTDEFAULT550;3.3.8删除数据完整性约束删除不同的数据完整性约束的语法格式。(1)删除主键约束:ALTERTABLE表名DROPPRIMARYKEY。(2)删除外键约束:ALTERTABLE表名DROPFOREIGNKEY约束名称。(3)删除唯一约束:ALTERTABLE表名DROPUNIQUE约束名称。(4)删除检查约束:ALTERTABLE表名DROPCHECK约束名称。非空约束和默认值约束只能修改,不能删除。使用SHOWCREATETABLE语句查看并确定具体的约束名称。删除数据完整性约束举例【例3-36】针对已经创建好的数据表student1,删除其中的检查约束。(1)确定约束名称

SHOWCREATETABLEstudent1;mysql>SHOWCREATETABLEstudent1;+-----------+--------------------------------------------------------------------------+|Table|CreateTable|+-----------+--------------------------------------------------------------------------+|student1|CREATETABLE`student1`(`stuno`char(11)NOTNULL,`stuname`varchar(50)DEFAULTNULL,`gender`char(1)DEFAULTNULL,`deptno`char(3)DEFAULTNULL,PRIMARYKEY(`stuno`),KEY`deptno`(`deptno`),CONSTRAINT`student1_ibfk_1`FOREIGNKEY(`deptno`)REFERENCES`department`(`deptno`)ONDELETESETNULLONUPDATECASCADE,CONSTRAINT`student1_chk_1`CHECK((`gender`in('男','女'))))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci|+-----------+--------------------------------------------------------------------------+删除数据完整性约束举例【例3-38】针对已经创建好的数据表student1,删除其中的检查约束。(1)查看检查约束名称

SHOWCREATETABLEstudent1;(2)删除“student1_chk_1”检查约束

ALTERTABLEstudent1DROPCHECKstudent1_chk_1;3.4课堂案例:学生成绩管理数据库的数据定义在第2章的课堂案例中设计的学生成绩管理数据库一共包含6个关系模式(院系表、学生表、课程表、教师表、选修成绩表和讲授安排表),每个关系模式对应一张数据表。本案例的主要任务是确定这6张数据表的结构,并完成数据表的创建。1.设计数据表(1)设计院系表department(2)设计学生表student1.设计数据表(3)设计课程表course(4)设计教师表teacher

1.设计数据表(5)设计选修成绩表score(6)设计讲授安排表teaching2.创建数据库创建一个名为scoredb的学生成绩管理数据库,采用MySQL默认的字符集和校对规则,并使其成为当前默认的数据库。如果前面已经创建同名数据库,先使用DROPDATABASE语句删除该数据库后再创建。DROPDATABASEIFEXISTSscoredb;CREATEDATABASEscoredb;USEscoredb;3.创建数据表(1)创建department表,只要求指定主键约束和唯一约束,暂时不指定默认值约束。CREATETABLEdepartment(deptnoCHAR(3)PRIMARYKEY,deptnameVARCHAR(50)UNIQUE,directorVARCHAR(50))3.创建数据表(2)创建stude

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论