版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
模块概览创建网上商城系统数据库MySQL数据库技术与项目应用03引言/FOREWORD数据库(Database)是存储数据的仓库,数据表是数据库中存储数据的基本单位。实际软件开发中,程序员除具备使用建模工具自动生成物理数据表的能力外,还应具备在数据库相关管理软件中手动维护数据库及数据表的能力。维护数据库和数据表的基本操作包括包括创建、修改、删除、查看等。本项目将以网上商城数据库系统为例,讲解在MySQL数据库系统中创建和维护操作数据库及数据表。目录/Contents010203创建和维护数据库解读MySQL的数据类型创建和操作数据表0405实现数据完整性添加和修改系统数据任务1创建和维护数据库正确创建数据库是管理和维护数据的基础,需要考虑字符集、存储引擎等相关内容。本节将介绍使用Navicat可视化界面和命令行两种方式实现数据库的创建和维护。任务场景创建数据库使用Navicat创建数据库使用SQL语句创建数据库语法说明如下:CREATEDATABASE是SQL语言中用于创建数据库的语句;数据库名:表示待创建的数据库名称,该名称在数据库服务器中必须唯一;[DEFAULT]CHARACATERSET:指定数据库的字符集名称;[DEFAULT]COLLATE:指定字符集对应的排序规则名称CREATEDATABASE数据库名[[DEFAULT]CHARACTERSET字符集名|[DEFAULT]COLLATE排序规则名];创建数据库【例3.2】使用SQL语句,创建名为onlinedb的数据库。mysql>CREATEDATABASEonlinedb
;QueryOK,1rowaffected(0.01sec)查看数据库查看数据库SQL语句mysql>SHOWDATABASES;+------------------------------+|Database
|+------------------------------+|information_schema
||mysql
||onlinedb
||performance_schema
||sys |+------------------------------+5rowsinset(0.06sec)SHOWDATABASES;查看数据库查看指定数据库信息的SQL语句mysql>SHOWCREATEDATABASEonlinedb;+----------+------------------------------------------------------------------------------------------------+|Database|CreateDatabase
|+----------+------------------------------------------------------------------------------------------------+|onlinedb|CREATEDATABASE`onlinedb`/*!40100DEFAULTCHARACTERSET
utf8mb4COLLATEutf8mb4_0900_ai_ci*//*!80016DEFAULTENCRYPTION='N'*/|+----------+------------------------------------------------------------------------------------------------+1rowinset(0.00sec)SHOWCREATEDATABASE数据库名;修改数据库修改数据库的基本语法为:【例3.5】使用SQL语句,修改数据库onlinedb的字符集设置为uft8,排序规则设置为utf8_bin。ALTERDATABASE数据库名[DEFAULT]CHARACTERSET字符集名|[DEFAULT]COLLATE排序规则名;mysql>ALTERDATABASEonlinedbCHARACTERSETutf8COLLATEutf8_bin;QueryOK,1rowaffected(0.00sec)删除数据库删除数据库的基本语法;【例3.6】删除数据库服务器中名为onlinedb的数据库,执行结果如下。mysql>DROPDATABASEonlinedb;QueryOK,0rowsaffected(0.16sec)学习提示:删除数据库会删除该数据库中所有的表和所有数据,且不能恢复,因此在执行删除数据库操作时要慎重。DROPDATABASE数据库名;MySQL的存储引擎存储引擎就是数据的存储技术。针对不同的处理要求,对数据采用不同的存储机制、索引技巧、读写锁定水平等。MySQL现提供有InnoDB、MyISAM、CSV、Memory等。查看MySQL支持的存储引擎【例3.7】查看MySQL服务器系统支持的存储引擎。SHOWENGINES;MySQL的存储引擎【例3.8】查看MySQL服务器系统支持的默认存储引擎。mysql>SHOWVARIABLESLIKE'default_storage_engine';+-------------------------+--------+|Variable_name |Value|+-------------------------+--------+|default_storage_engine|InnoDB|+-------------------------+--------+1rowinset(0.00sec)MySQL的存储引擎InnoDB存储引擎InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。InnoDB的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行,MySQL一般优先考虑InnoDB引擎。InnoDB具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)。InnoDB是为处理巨大数据量的最大性能设计,被用在众多需要高性能的大型数据库站点上。InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID列,并以此作为主键。MySQL数据库的组成MySQL数据库文件MySQL中每一个数据库,在data目录下都会有一个与数据库同名的文件夹,用于存储该数据库的表文件。MySQL数据库文件的组成取决于该数据库使用的存储引擎。InnoDB存储引擎采用表空间来管理数据,其主要文件如下表。文件名说明Ibdata*MySQL中共享表空间文件,
存储InnoDB系统信息和用户数据表数据和索引,为所有表共用。如ibdata1、ibdata2等*.ibdibd文件表示单表表空间文件,每个表使用一个表空间文件,存储用户数据表数据和索引。不能直接读取Ibtmp*
MySQL临时独立的表空间文件。如ibtmp1、ibtmp2等ib_logfile*MySQL的日志文件,如ib_logfile0、ib_logfile1等*.errMySQL的错误日志文件,记录MySQL服务器运行或启停时发生的错误信息。可用记事本打开*_bin.00000n二进制日志文件,n是1开始的自然数。用于记录数据库中对象和数据的添加和更改操作undo_00*MySQL中的undo日志文件,主要记录事务异常时的数据,以实现数据回滚操作,如undo_001、undo_002等*.pid用来记录当前mysqld进程的pid值,即ProcessID*.pemMySQL中的证书文件,用于SSL认证。包括MySQL服务器的公钥、私钥及客户端和服务器端的证书和密钥等。如private_key.pem、public_key.pem等系统数据库MySQL的数据库包括系统数据库和用户数据库用户数据库是用户创建的数据库;系统数据库是由MySQL安装程序自动创建的数据库,用于存放和管理用户权限和其他数据库的信息,包括数据库名、数据库中的对象及访问权限等信息。MySQL中共有4个可见的系统数据库数据库名说明mysql包含用于存储MySQL服务的系统信息表,包括授权系统表、系统对象信息表、日志系统表、服务器端辅助系统表等。此数据库中的表默认情况下多为MYASIM引擎。information_schema用于保存MySQL服务器所维护的所有其他数据库的信息,包括数据库名、数据库的表、表中列的数据类型与访问权限等。此数据库中的表均为视图,因此在用户或安装目录下无对应用数据文件。performance_schema主要用于收集数据库服务器的性能参数。此数据库中所有表的存储引擎为performance_schema,用户不能创建存储引擎为performance_schema的表。默认情况下些数据库为关闭状态。syssys数据库中所有数据来自performance_schema。目标是把performance_schema的把复杂度降低,让DBA(数据库管理员)更快的了解DB的运行情况。
任务2MySQL中数据的表示数据类型决定了数据的存储格式和有效范围等。MySQL提供了丰富的数据类型,包括整数类型、小数类型、字符串类型、日期类型和JSON类型等。本节通过实例解读MySQL中的常用数据类型,以及在实际开发中数据类型的选择建议。任务场景整数类型整数类型是数据库中最基本的数据类型,MySQL中支持的5种整数类型,整数类型的数据范围主要是通过区分有符号和无符号数据。整数类型字节数无符号数的取值范围有符号数的取值范围TINYINT10~255-128~127SMALLINT20~65535-32768~32767MEDIUMINT30~224-223~223-1INT40~232-1-231~231-1BIGINT80~264-1-263~263-1整数类型【例3.9】创建test_int表,用于测试整数类型的数据存储。创建test_int数据表向表test_int中,添加两条测试记录如下。mysql>CREATETABLEtest_int->(->int_1int,->int_2intunsigned,->int_3int(6)zerofill,->int_4tinyint,->int_5tinyintunsigned->);#测试1:添加成功mysql>INSERTINTOtest_intVALUES(100,100,100,100,100);QueryOK,1rowaffected(0.01sec)#测试2:添加失败mysql>INSERTINTOtest_intVALUES(100,-100,100,100,100);ERROR1264(22003):Outofrangevalueforcolumn'int_2'atrow1整数类型查看表结构查询test_int表mysql>DESCtest_int;+-------+--------------------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-------+--------------------------+------+-----+---------+-------+|int_1|int|YES||NULL|||int_2|intunsigned|YES||NULL|||int_3|int(6)unsignedzerofill|YES||NULL|||int_4|tinyint|YES||NULL|||int_5|tinyintunsigned|YES||NULL||+-------+--------------------------+------+-----+---------+-------+5rowsinset(0.00sec)mysql>SELECT*FROMtest_int;+-------+-------+--------+-------+-------+|int_1|int_2|int_3|int_4|int_5|+-------+-------+--------+-------+-------+|100|100|000100|100|100|+-------+-------+--------+-------+-------+1rowinset(0.00sec)小数类型MySQL中,小数类型包括浮点数和定点数。浮点数又包括单精度(FLOAT)和双精度(DOUBLE),定点数类型是DECIMAL;浮点数在数据库中存放的是近似值,定点数存放的是精确值。类型字节数负数的取值范围非负数的取值范围FLOAT4-3.402823466E+38~-1.175494351E-380或1.175494351E-38~3.402823466E+38DOUBLE8-1.7976931348623157E+308~-2.2250738585072014E-3080
和
2.2250738585072014E-308~1.7976931348623157E+308DECIMAL(M,D)或DEC(M,D)M+2同DOUBLE型同DOUBLE型小数类型DECIMAL类型的有效取值范围由M和D决定M称为精度,是数据的总长度,小数点不占位D为标度,是指小数点后面的位数。如DECIMAL(6,2)表示指定的数据类型为DECIMAL,数据长度是6,小数点后保留2位,如1234.56是符合该类型的小数。数据类型(M,D)小数类型【例3.10】创建test_dec表,用于测试小数类型的数据存储。创建测试表添加测试数据mysql>CREATETABLEtest_dec->(->float_1float(10,2),->double_2double(10,2),->decimal_3decimal(10,2)->);QueryOK,0rowsaffected,2warnings(0.02sec)mysql>INSERTINTOtest_decVALUES(12345678.99,12345678.99,12345678.99);QueryOK,1rowaffected(0.01sec)小数类型查询表结果mysql>SELECT*fromtest_dec;+-------------+-------------+-------------+|float_1|double_2|decimal_3|+-------------+-------------+-------------+|12345679.00|12345678.99|12345678.99|+-------------+-------------+-------------+1rowinset(0.00sec)日期类型MySQL中提供了多种表示日期和时间的数据类型,其主要差别是在精度和范围上。类型字节数取值范围零值表示形式YEAR11901~21550000DATE41000-01-01~9999-12-310000:00:00TIME3-838:59:59~838:59;5900:00:00DATETIME81000-01-01
00:00:00~9999-12-3123:59:590000-00-0000:00:00TIMESTAMP419700101080001~20380119111407000000000000000日期类型【例3.11】创建test_date表,用于测试日期类型的数据存储。创建测试表添加测试数据mysql>CREATETABLEtest_date->(->year_1year,->date_2date,->time_2time,->datetime_4datetime,->timestamp_5timestamp->);QueryOK,0rowsaffected(0.03sec)mysql>INSERTINTOtest_dateVALUES(NOW(),CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);QueryOK,1rowaffected(0.01sec)日期类型查询表结果mysql>SELECT*FROMtest_date;字符串类型字符串类型是一种非常重要的数据类型,MySQL提供了非常丰富的字符串类型。类型允许长度用途CHAR0~255字节定长字符串VARCHAR0~65535字节变长字符串BIT1~64位不超过8个字符的字符串,存储每个字符ASCII码TINYTEXT0~255字节短文本字符串TEXT0~65535字节长文本字符串BINARY0~255字节定长的二进制数据VARBINARY0~65535字节变长的二进制数据TINYBLOB0~255字节不超过255个字符的二进制字符串BLOG0~65535字节二进制形式的长文本字符串MECDIUMTEXT0~167772150字节中等长度文本字符串LONGTEXT0~4294967295字节极大长度文本字符串MEDIUMBLOB0~167772150字节中等长度的二进制字符串LONGBLOG0~4294967295字节极大长度的二进制字符串字符串类型【例3.12】创建test_char1表,测试字符串类型单列数据存储大小。测试1:超出列长度的定义测试2:超出列长度的定义mysql>CREATETABLEtest_char1->(->varchar_1varchar(65535)->);ERROR1074(42000):Columnlengthtoobigforcolumn'varchar_1'(max=21845);useBLOBorTEXTinsteadmysql>CREATETABLEtest_char1->(->varchar_1varchar(21845)->);ERROR1118(42000):Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.Thisincludesstorageoverhead,checkthemanual.YouhavetochangesomecolumnstoTEXTorBLOBs字符串类型测试3:符合列长度的定义mysql>CREATETABLEtest_char1->(->varchar_1varchar(21844)->);QueryOK,0rowsaffected(0.02sec)字符串类型【例3.13】创建test_char2表,测试字符串类型单行数据存储大小。测试1:超出行长度的定义测试2:符合行长度的定义mysql>CREATETABLEtest_char2->(->varchar_1varchar(21844),->char_2char(10)->);ERROR1118(42000):Rowsizetoolarge.Themaximumrowsizefortheusedtabletype,notcountingBLOBs,is65535.Thisincludesstorageoverhead,checkthemanual.YouhavetochangesomecolumnstoTEXTorBLOBsmysql>CREATETABLEtest_char2->(->varchar_1varchar(21834),->char_2char(10)->);QueryOK,0rowsaffected(0.06sec)JSON类型JSON是一种轻量级的数据交换格式,是ECMAScript(欧洲计算机协会制定的JS规范)的一个子集,是当前最为流行的数据交换格式。自MySQL5.7开始支持JSON数据类型后,数据库与应用程序间的数据交换变得为简单、灵活和高效。MySQL中,JSON类型的值主要有对象和数组两种方式。JSON对象JSON数组#包含2个键值对的JSON对象{"database":"MySQL","language":"Java"}#包含3个键值对的JSON对象{"uid":"1","uname":"李明","ugender":"男"}["abc",12,NULL,TRUE,FALSE]JSON类型【例3.14】创建test_json表,测试JSON数据类型的存储。创建测试表添加测试数据mysql>CREATETABLEtest_json->(->json_1JSON,->json_2JSON->);QueryOK,0rowsaffected(0.03sec)mysql>INSERTINTOtest_json->VALUES('{"uid":"1","uname":"李明"}',->'["reading","music"]');QueryOK,1rowaffected,1warning(0.01sec)JSON类型查看表结果mysql>SELECT*FROMtest_json;+-------------------------------+----------------------+|json_1
|json_2|+-------------------------------+----------------------+|{"uid":"1","uname":"李明",}|["reading","music"]|+------------------------------+----------------------+1rowinset(0.00sec)任务3创建和操作数据表数据表是数据库中存储数据的基本单位,一个数据库可包含若干个数据表。在关系型数据库管理系统中,应用系统的基础数据都存放在关系表中,数据库程序员在创建完数据库后需要创建数据表,并确定表中各个字段列的名称、数据类型、数据精度、是否为空等属性。本节主要讲述创建和查看数据表、复制、修改、删除表等操作。任务场景创建和查看数据表关系数据库中,表是以行和列的形式组织起来,数据存在于行和列相交的单元格中,1行数据表示1条唯一的记录,1列数据表示1个字段,唯一标识1行记录的属性称为主键。查看数据表SQL语句【3.15】查看onlinedb数据库下的数据表使用USE语句将onlinedb设为当前数据库查看数据表SHOWTABLESmysql>USEonlinedb;Databasechangedmysql>SHOWTABLES;Emptyset(0.00sec)使用Navicat图形工具创建表【例3.16】使用Navicat工具,在onlinedb数据库中新建会员表,表名为users。序号字段名数据类型标识主键允许空默认值说明1uidint是是否
用户id2unamevarchar(30)
否
用户名3upwdvarchar(50)
否
密码4ugenderchar(1)
是男性别使用CREATETABLE语句创建表CREATETABLE[IFNOTEXISTS][数据库名.]表名(字段定义1,
字段定义2,……
字段定义n);
IFNOTEXISTS:可选参数,判断表不存在时才执行创建表的语句。
表名:表示所要创建的表的名称,若不在当前数据库中创建表,则需要使用数据库名.表名的方式引用,
字段定义:定义表中的字段。包括字段名、数据类型、是否允许为空,指定默认值、主键约束、唯一性约束、注释字段、是否为外键以及字段类型的属性等。
NULL(NOTNULL):表示字段是否可以为空。
DEFUALT:指定字段的默认值。
AUTO_INCREMENT:设置字段为自增,只有整数类型的字段才能设置自增。自增默认基数从1开始,步长为1,每个表只能有一个自增字段。
UNIQUEKEY:唯一性约束。
PRIMARYKEY:主键约束。
COMMENT:注释字段。
外键定义:外键约束。字段名类型[NOTNULL|NULL][DEFAULT默认值][AUTO_INCREMENT][UNIQUEKEY|PRIMARYKEY][COMMENT'字符串'][外键定义]创建表的语法格式字段定义的语法格式使用CREATETABLE语句创建表【例3.17】使用CREATETABLE语句,实现【例3.16】中users表的创建。CREATETABLEusers->(uidint(11)PRIMARYKEYAUTO_INCREMENTCOMMENT'用户id',->unamevarchar(30)NOTNULL,->upwdvarchar(50)NOTNULL,->ugenderchar(1)DEFAULT'男'->);查看表使用DESCRIBE语句查看表结构【例3.18】使用DESCRIBE语句查看users的表结构mysql>DESCRIBEonlinedb.users;+---------+--------------+-------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+---------+--------------+-------+-----+---------+----------------+|uid|int(11)|NO|PRI|NULL|auto_increment||uname|varchar(30)|NO||NULL|||upwd|varchar(50)|NO||NULL|||ugender|char(1)|YES||男||+---------+--------------+-------+-----+---------+----------------+4rowsinset(0.02sec)DESCRIBE表名;查看表使用SHOWCLOUMNSFROM语句查看表结构【例3.19】使用SHOWFULLCOLUMNSFROM语句查看users的表结构。mysql>SHOWFULLCOLUMNSFROMusers;SHOW[FULL]COLUMNSFROM表名;查看表使用SHOWCREATETABLE语句查看表结构【例3.20】使用SHOWCREATETABLE语句查看users的表结构。mysql>SHOWCREATETABLEusers\G;***************************1.row***************************Table:usersCreateTable:CREATETABLE`users`(`uid`intNOTNULLAUTO_INCREMENTCOMMENT'用户id',`uname`varchar(30)NOTNULL,`upwd`varchar(50)NOTNULL,`ugender`char(1)DEFAULT'男',PRIMARYKEY(`uid`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci1rowinset(0.00sec)SHOWCREATETABLE表名;查看表【例3.21】使用\G语法查看users的表结构。mysql>DESCUSERS\G;***************************1.row***************************Field:uidType:intNull:NOKey:PRIDefault:NULLExtra:auto_increment***************************2.row***************************Field:unameType:varchar(30)Null:NOKey:Default:NULLExtra:***************************3.row***************************Field:upwdType:varchar(50)Null:NOKey:Default:NULLExtra:***************************4.row***************************Field:ugenderType:char(1)Null:YESKey:Default:男Extra:4rowsinset(0.00sec)修改表当系统需求变更或设计之初考虑不周全等情况发生时,就需要对表的结构进行修改。修改表可以包括修改表名、修改字段名、修改字段数据类型、修改字段排列位置、增加字段、删除字段、修改表的存储引擎等。MySQL中,使用ALTERTABLE语句来实现表的修改操作。修改表名【例3.22】将数据库onlinedb中的users表更名为users_new表ALTERTABLE原表名RENAME[TO]新表名;mysql>ALTERTABLEusersRENAMEusers_new;QueryOK,0rowsaffected(0.01sec)修改表修改字段名【例3.23】将users_new表中upwd的字段名称修改为upassword,数据类型为varchar(50)。ALTERTABLE表名CHANGE原字段名新字段名新数据类型;mysql>ALTERTABLEusers_newCHANGEupwdupasswordvarchar(50);QueryOK,0rowsaffected(0.03sec)Records:0Duplicates:0Warnings:0修改表修改字段类型【例3.24】修改users_new表,将upassword字段类型改为varbinary,长度为50。ALTERTABLE表名MODIFY字段名新数据类型;mysql>ALTERTABLEusers_newMODIFYupasswordvarbinary(50);QueryOK,0rowsaffected(0.03sec)Records:0Duplicates:0Warnings:0修改表修改字段的排列位置【例3.25】修改users_new表,将字段upassword排列到ugender字段之后。ALTERTABLE表名MODIFY字段名1数据类型FIRST|AFTER字段名2mysql>ALTERTABLEusers_newMODIFYupasswordvarbinary(50)AFTERugender;QueryOK,0rowsaffected(0.03sec)Records:0Duplicates:0Warnings:0修改表添加字段【例
3.26】在users_new表中增加字段ulogin,用于存储用户的登录帐号,其数据类型为varchar(20),并将其放在uid之后。ALTERTABLE表名ADD字段名数据类型[FIRST|AFTER已存在的字段名];mysql>ALTERTABLEusers_newADDuloginvarchar(20)AFTERuid;QueryOK,0rowsaffected(0.03sec)Records:0Duplicates:0Warnings:0修改表删除字段【例3.27】删除users_new表中的字段ugender。ALTERTABLE表名DROP字段名;mysql>ALTERTABLEusers_newDROPugender;QueryOK,0rowsaffected(0.07sec)Records:0Duplicates:0Warnings:0复制表MySQL中,表的复制操作包括复制表结构和表数据。复制操作可以在同一个数据库中执行,也可以跨数据库实现。复制表结构及数据到新表【例3.28】复制users_new表的结构及数据到temp1表。CREATETABLE新表名SELECT*FROM源表名;mysql>createtableusersselect*fromuser;QueryOK,3rowsaffected(0.01sec)Records:3Duplicates:0Warnings:0复制表只复制表结构到新表【例3.29】复制users_new表的结构到temp2表使用关键字LIKE实现表结构的复制【例3.30】复制users_new表的结构到temp3表CREATETABLE新表名SELECT*FROM源表名WHEREFALSE;mysql>CREATETABLEtempSELECT*FROMuserWHEREFALSE;QueryOK,0rowsaffected(0.02sec)CREATETABLE新表名LIKE源表名;mysql>CREATETABLEtemp3LIKEusers_new;QueryOK,0rowsaffected(0.02sec)复制表复制表的部分字段及数据到新表【例3.31】复制users_new表,将ulogin和upassword两列数据到temp4表。CREATETABLE新表名AS(SELECT字段1,字段2,......FROM源表名);mysql>CREATETABLEtemp4AS(SELECTulogin,upasswordFROMusers_new);QueryOK,3rowsaffected(0.02sec)Records:3Duplicates:0Warnings:0删除表删除表时,表的结构、数据、约束等将被全部删除。【例3.32】删除名为temp1的表。【例3.33】同时删除名为temp2、temp3和temp4的表。DROPTABLE表名;mysql>DROPTABLEtemp1;QueryOK,0rowsaffected(0.01sec)mysql>DROPTABLEtemp2,temp3,temp4;QueryOK,0rowsaffected(0.01sec)任务4实现数据的完整性数据完整性是指数据的准确性和逻辑一致性,用来防止数据库中存在不符合语义、无效数据或错误数据等。例如,网上商城系统数据库中的商品编号、名称不能为空,订单号必须唯一,邮箱格式必须符合规范等。MySQL中,数据完整性通常使用约束来实现,本任务主要的约束包括PRIMARYKEY约束、NOTNULL约束、DEFAULT约束、UNIQUE约束、CHECK约束和FOREIGHKEY约束。任务场景PRIMARYKEY约束PRIMARYKEY又称为主键约束,定义表中构成主键的一列或多列。主键用于唯一标识表中的每条记录,作为主键的字段值不能为NULL且必须唯一,可以是单一字段,也可以是多个字段的组合。每个数据表中最多只能有一个主键约束。使用Navicat创建主键约束【例3.34】在Navicat中创建商品表goods。序号字段数据类型主键允许空说明1gidint是否商品id2gnamevarchar(200)
否商品名称3gpricedecimal(20,2)
否价格使用PRIMARYKEY关键字设置主键约束主键约束由关键字PRIMARYKEY标识。【例3.35】使用SQL语句,创建商品表goods,并设置gid列为主键。字段名数据类型PRIMARYKEYmysql>CREATETABLEgoods->(gidintPRIMARYKEY,#标识该字段为主键->gnamevarchar(30)NOTNULL,->gpricedecimal(20,2)->);QueryOK,0rowsaffected(0.03sec)使用PRIMARYKEY关键字设置主键约束当主键由多个字段组合构成时,主键只能在字段定义完成后设置。【例3.36】创建购物车表car。
PRIMARYKEY(字段名1,字段名2,…,字段名n)序号字段数据类型主键允许空说明1gidint是否商品id2uidint是否用户id3cnumint
购买数量mysql>CREATETABLEcart->(gidint,-> uidint,->cnumint,->PRIMARYKEY(gid,uid)#定义复合主键->);QueryOK,0rowsaffected(0.02sec)NOTNULL约束NOTNULL约束也称非空约束强制字段的值不能为NULL,它不等同于0或空字符串,也不能跟任何值进行比较。NOTNULL只能用作约束使用。【例3.37】为商品goods添加字段gcode(商品编号),类型为varchar(50),不为NULL,并将其放置gid字段之后。属性名数据类型NOTNULLmysql>ALTERTABLEgoods->ADDgcodevarchar(50)NOTNULLAFTERgid;QueryOK,0rowsaffected(0.06sec)Records:0Duplicates:0Warnings:0DEFUALT约束DEFAULT约束即默认值约束,用于指定字段的默认值。当向表中添加记录时,若未为字段赋值,数据库系统会自动为将字段的默认值插入。【例3.38】修改购物车表cart,将购买数量的默认值设置为1。属性名数据类型DEFAULT默认值mysql>ALTERTABLEcart->MODIFYcnumintDEFAULT1;#修改默认值为1QueryOK,0rowsaffected(0.06sec)Records:0Duplicates:0Warnings:0UNIQUE约束UNIQUE约束又称唯一性约束,是指数据表中一列或一组列中只包含唯一值。【例3.39】修改users_new表,为字段登录名ulogin添加UNIQUE约束。属性名数据类型UNIQUEmysql>ALTERTABLEusers_new->MODIFYuloginvarchar(50)UNIQUE;QueryOK,0rowsaffected(0.06sec)Records:0Duplicates:0Warnings:0
CHECK约束CHECK约束是列输入数据值的验证规则,列中输入数据必须满足CHECK约束的条件,否则无法写入数据库。MySQL8.0开始支持CHECK约束。【例3.40】修改goods表,为商品价格添加CHECK约束,要求价格必须大于0等于。CONSTRAINT约束名CHECK(表达式)mysql>ALTERTABLEgoods->ADDCONSTRAINTck_gpriceCHECK(gprice>=0);QueryOK,0rowsaffected(0.06sec)Records:0Duplicates:0Warnings:0FOREIGNKEY约束FOREIGNKEY约束又称外键约束,它与其他约束不同的之处在于,约束的实现不只在单表中进行,而是在两张表间进行。表间关系外键约束强制实施表与表之间的引用完整性。外键是表中的特殊字段,表示了相关联两个表的联系。FOREIGNKEY约束使用Navicat图形工具创建外键约束【例3.41】创建商品类型表category和商品goods表,category表结构如表3-10所示,goods表结构如表3-11所示。其中主表为category,从表为goods。序号字段数据类型主键外键允许空说明1cidint是
否类别id2cnamevarchar(30)
否类别名称序号字段数据类型主键外键允许空说明1gidint是
否商品id2cidint
是否类别id3gcodevarchar(50)
否商品编号4gnamevarchar(200)
否商品名称5gpricedecimal(20,2)
商品价格FOREIGNKEY约束使用SQL语句添加外键约束【例3.42】使用SQL语句,实现例【例3.41】。CONSTRAINT外键名FOREIGNKEY(外键字段名)REFERENCES主表名(主键字段名)mysql>ALTERTABLEgoods->ADDCONSTRAINTfk_goods_cidFOREIGNKEY(cid)REFERENCEScategory(cid);QueryOK,0rowsaffected(0.08sec)Records:0Duplicates:0Warnings:0FOREIGNKEY约束外键约束的级联更新和删除外键约束实现了表间的引用完整性,当主表中被引用列的值发生变化时,为了保证表间数据的一致性,从表的中与该值相关的信息也应该相应更新,这就是外键约束的级联更新和删除。CONSTRAINT外键名FOREIGNKEY(外键字段名)REFERENCES主表名(主键字段名)[ONUPDATE{CASCADE|SETNULL|NOACTION|RESTRICT}][ONDELETE{CASCADE|SETNULL|NOAC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 糖果成型工操作技能测试考核试卷含答案
- 职业技能训练师安全素养评优考核试卷含答案
- 镀锡工复试强化考核试卷含答案
- 托育师岗前基础常识考核试卷含答案
- 肉品分级员班组考核强化考核试卷含答案
- 洗衣粉制造工创新应用能力考核试卷含答案
- 稀土离子交换工岗前可持续发展考核试卷含答案
- 临床检验类设备组装调试工岗前岗后考核试卷含答案
- 企业培训师安全理论水平考核试卷含答案
- 2026百威招聘ai面试题及答案
- 宁德时代薪酬管理制度
- 遗产补偿协议书范本
- 2025统编版(2024)小学道德与法治一年级下册《第13课-快乐儿童节》教学设计
- 人力制动机制动RAILWAY课件
- 恶性心律失常的急诊处理
- 预应力锚索基本试验方案
- 2023年高考英语真题全国乙卷及参考答案
- 中医护理方案培训
- DLT802.7-2023电力电缆导管技术条件第7部分非开挖用塑料电缆导管
- 《消化系统疾病预防课件》
- 中考英语表格类阅读理解专题
评论
0/150
提交评论