二、本单元知识点概述
(Ⅰ)知识点概述
二、本单元教学目标
(Ⅰ)重点知识目标
1.Mysql的数据类型
2.如何选择数据类型
3.创建表
4.修改表
5.删除表
(Ⅱ)能力目标
1.熟练创建数据库及删除数据库
2.牢记数据类型
3.熟练表的操作
三、本单元知识详讲
2.1 MySQL数据类型介绍
MySQL数据库提供了多种数据类型。其中包括整数类型、浮点数类型、定点数类型、 日期和时间类型、字符串类型和二进制数据类型。不同的数据类型有各自的特点,使用范 围不相同。而且,存储方式也不一样。本节将详细讲解各种数据类型。首先简单介绍以下创建表的sql语句(create table 表名(字段1名称 字段类型,...))
2.1.1整数类型★★★★★
整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT 这两类整数类型。MySQL数据库除了支持这两种类型以外,还扩展支持了 TINYINT、MEDIUMINT和BIGINT。本小节将讲解各种整数类型的取值范围、存储的字节数、特点 等内容。下面从不同整数类型的字节数、取值范围等方面进行对比,如表2.1所示。
表2.1 MySQL的整数类型
整数类型 | 字节数 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0—255 | -128—127 |
SMALLINT | 2 | 0〜65535 | —32768〜32767 |
MEDIUMINT | 3 | 0〜16777215 | -8388608〜8388607 |
INT | 4 | 0〜4294967295 | —2147483648〜2147483647 |
INTEGER | 4 | 0〜4294967295 | —2147483648〜2147483647 |
BIGINT | 8 | 0〜18446744073709551615 | -9223372036854775808〜9223372036854775807 |
从,表2.1中可以看到,INT类型和INTEGER类型的字节数和取值范围都是一样的。其 实,在MySQL中INT类型和INTEGER类型是一样的。TINYINT类型占用的字节最小,只需要1个字节。因此,其取值范围是最小的。BIGINT类型占用的字节最大,需要8个 字节。因此,其取值范围是最大的。 不同类型的整数类型的字节数不同。根据类型所占的字节数可以算出该类型的取值范 围。例如,TINYINT的空间为1个字节,1个字节是8位。那么,TINYINT无符号数的最大值为2的八次方-1,即为255。TINYINT有符号数的最大值为2的七次方-1,即为127。同理可以算出其他不同整数类型的取值范围。
MySQL支持数据类型的名称后面指定该类型的显示宽度。其基本形式如下: 数据类型(显示宽度) 其中,数据类型参数是整数数据类型的名称;显示宽度参数是指定宽度的数值。显示 宽度是指能够显示的最大数据的长度。例如,INT(4)在不指定宽度的情况下,每个整数类型都有默认的显示宽度。 【示例2-1】下面某表的字段a、b、c、d和e的数据类型分别为TINYINT, SMALLINT, MEDIUMINT、INT和BIGINT,这些整数类型都没有设置显示宽度,都为其默认值。该表的数据类型显示如下:
从上面结果可以看出各种整数类型的默认显示宽度。
TINYINT类型的默认显示宽度为 4;
SMALLINT类型的默认显示宽度为6;
MEDIUMINT类型的默认显示宽度为9;
INT类 型的默认显示宽度为11;
BIGINT类型的默认显示宽度为20。
仔细观察会发现,TINYINT 类型的默认显示宽度与其有符号数的最小值的显示宽度相同。因为此处负号是占一个位置 的。依此类推,其他整数类型的默认显示宽度与其有符号数的最大值的显示宽度相同。这 个可以理解为,.一个数据类型的默认显示宽度刚好能显示该数据类型的所有值。
2.1.2 浮点数类型和定点数类型★★★★
MySQL中使用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数 (FLOAT型)和双精度浮点数(DOUBLE型)。定点数类型就是DECIMAL型。本小节中将讲解FLOAT型、DOUBLE型和DECIMAL型的取值范围、存储的字节数和特点等内容。 下面从这三种类型的字节数、取值范围等方面进行对比,如表2.2所示。
表2.2 MySQL的浮点数类型和定点数类型
整数类型 | 字节数 | 负数的取值范围 | 非负数的取值范围 |
---|---|---|---|
FLOAT | 4 | -3.402823466E+38 〜-1.175494351E-38 | 0 和 1.175494351E—38〜3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308〜-2.225073 8585072014E-308 | 0 和 2.2250738585072014E-308〜1.7976931348623157E+308 |
DECIMAL(M,D) 或 DEC(M,D) | M+2 | 同DOUBLE型 | 同DOUBLE型 |
从上面表中可以看到,DECIMAL型的取值范围与DOUBLE相同。但是,DECIMAL的有效取值范围由M和D决定。而且,DECIMAL型的字节数是M+2。也就是说,定点数的存储空间是根据其精度决定的。 MySQL中可以指定浮点数和定点数的精度。其基本形式如下: 数据类型(M,D) 其中,“数据类型”参数是浮点数或定点数的数据类型名称;
M:这个字段的长度
D:有几位小数 这个没有精度丢失,经常用来表示金钱
例如,FLOAT(6,2) 的含义数据FLOAT型,数据长度为6,小数点后保留2位。按此定义,1234.56是符合要 求的。
注意:上述指定小数精度的方法虽然都适合于浮点数和定点数,但不是浮点数的标准用法。建议在定义浮点数时,如果不是实际情况需要,最好不要使用。如果使用了,可能会影响数据库的迁移。对定点数而言,DECIMAL(M,D)是定点数的标准格式, 一般情况下可以选择这种数据类型。
如果插入值的精度高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度 达到要求。不同的是,FLOAT型和DOUBLE型在四舍五入时不会报错,而DECIMAL型 会有警告。
【示例2-2】下面某表的字段a、b和c的数据类型分别是FLOAT(6,2)、DOUBLE(6,2) 和DECIMAL(6,2),向表中插入3.143、3.145和3.1434。其显示结果如下:
如果不指定精度,浮点数和定点数有其默认的精度。FLOAT型和DOUBLE型默认会保存实际精度,但这与操作系统和硬件的精度有关。DECIMAL型默认整数位为10,小数 位为0,即默认为整数。
【示例2-3】下面某表的字段a、b和c的数据类型分别是FLOAT、DOUBLE和 DECIMAL,向表中插入3.143、3.145和3.1434。其显示结果如下:
上面程序结果显示,字段a和b是按照实际精度保存的。而字段c进行了四舍五入处理,而且没有小数位。
在MySQL中,定点数以字符串形式存储。因此,其精度比浮点数要高,而且, 浮点数会出现误差,这是浮点数一直存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数(DECIMAL )比较安全。
2.1.3 日期与时间类型★★★★
日期与时间类型是为了方便在数据库中存储日期和时间而设计的。 MySQL中有多种表示日期和时间的数据类型。其中,
YEAR类型表示时间;
DATE类型表示日期;
TIME 类型表示时间;
DATETIME和TIMESTAMP表示日期和时间。
本小节将介绍上述类型的存储的字节数、取值范围和特点。
下面从这5种日期与时间类型的字节数、取值范围和零值等方面进行对比,如表2.3所示。 表2.3 MySQL的日期与时间类型
整数类型 | 字节数 | 取值范围 | 零 值 |
---|---|---|---|
YEAR | 1 | 1901〜2155 | 0000 |
DATE | 4 | 1000-01-01 〜9999-12-31 | 0000:00:00 |
TIME | 3 | 一838:59:59〜838:59:59 | 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00〜9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 | 19700101080001-20380119111407 | 00000000000000 |
从上表中可以看到,每种日期与时间类型都有一个有效范围。如果插入的值超过了这个范围,系统会报错,并将零值插入到数据库中。不同的日期与时间类型有不同的零值,上表中已经详细列出。
YEAR类型使用1个字节来表示年份。MySQL中以YYYY的形式显示YEAR类型的 值。给YEAR类型的字段赋值的表示方法如下: 使用4位字符串或数字表示。其范围从1901〜2155。输入格式为'YYYY,或YYYY。 例如,输入'2008'或者2008,可直接保存为2008。如果超过了范围,就会插入0000。
【示例2-4】下面某表的字段a的数据类型是YEAR类型,向表中插入1997、'1998' 和'1900'。其显示结果如下:
结果显示,1997和1998直接存储到字段a中。而1900没有插入到字段a中,而是显示 0000 ,此处还有“Out of range value for column a at row 1"的警告信息。
TIME类型使用3个字节来表示时间。MySQL中以HH:MM:SS的形式显示TIME类 型的值。 其中,
HH表示时;
MM表示分,取值范围为0〜59;
SS表示秒,取值范围是0〜 59;
TIME类型的范围可以从'-838:59:59'〜'838:59:59'。
虽然,小时的范围是0〜23。 但是为了表示某种特殊需要的时间间隔,将TIME类型的范围扩大了。而且,还支持了负值。TIME类型的字段赋值的表示方法如下。 'D HH:MM:SS'格式的字符串表示。其中,D表示天数,取值范围是0〜34。保存时,小时的值等于(D*24+HH)。例如,输入'2 11:30:50' , TIME类型会转 换为59:30:50。当然,输入时可以不严格按照这个格式,也可以是“HH:MM:SS”、HH:MM”、“DHH:MM”、“DHH” 或者 “SS” 等形式。例如,输入'30', TIME类型会转换为00:00:30。 【示例2-5】下面某表的字段a的数据类型是TIME类型,向表中插入'2 23:50:50'、‘22:22:22’、'11:11'、'2 20:20'、'2 20'和'30'。其显示结果如下:
结果显示,‘223:50:50’ 转换为 71:50:50;‘11:11’转换为 11:11:00;20:20,转换为 68:20:00;‘2 20’转换为 68:00:00; '30'转换为 00:00:30。
HHMMSS'格式的字符串或HHMMSS格式的数值表示。例如,输入'345454', TIME类型会转换为34:54:54;输入值为数值345454, TIME类型也会转换为34:54:54。如果输入0和'0',那么TIME类型会转换为0000:00:00。 【示例2-6】下面某表的字段a的数据类型是TIME类型,向表中插入121212、 '131313'、 '0'和0。其显示结果如下:
结果显示,121212转换为12:12:12;‘131313’转换为13:13:13; '0'和0转换为 00:00:00。如果分钟和秒钟大于60时,系统会出现“Out of range value for column 'a* at row 1”这样的警告信息。
使用CURRENT TIME或者NOW。输入当前系统时间。 【示例2-7】下面某表的字段a的数据类型是TIME类型,向表中插入CURRENT_TIME和NOW()。其显示结果如下:
结果显示,CURRENTJTIME和NOW()都转换为当前系统时间。因此,如果要获取当 前的系统时间,最好选择CURRENTJTIME和NOW()。 一个合法的TIME值,如果超出TIME的范围,将被裁为范围最接近的端点,如, '880:00:00'被转换为838:59:59。无效TIME值,在命令行下是无法被插入到表中的。 注意:如果插入的TIME值是无效的,系统会提示“ERROR 1292 (22007): Incorrect time value5,.即使这个无效值被插入到表中,其值也会被转换为00:00:00。例如, '877034'就是一个无效的值,因为分钟部分超出了范围。TIME类型专门用来存储时间数据,而且只占3个字节。如果只需要记录时间,选择TIME类型是最合适的。
DATE类型使用4个字节来表示日期。MySQL中是以YYYY-MM-DD的形式显示 DATE类型的值。其中,YYYY表示年;MM表示月;DD表示日。DATE类型的范围可 以从,1000-01-01,〜‘9999-12-31'。
给DATE类型的字段赋值的表示方法如下: 'YYYY-MM-DD'或'YYYYMMDD'格式的字符串表示。这种方式可以表达的 范围是'1000-01-01'〜‘9999-12-31’。例如,输入'4008-2-8,, DATE 类型 将转换为 4008-02-08;输入'20220308' , DATE 类型将转换为 2022-03-08
MySQL中还支持一些不严格的语法格式,任何标点都可以用来做间隔符。 如 'YYYY/MM/DD'、'YYYY@MM@DD'、'YYYY.MM.DD'等分隔形式。例如,输 入'2011.3.8' , DATE 类型将转换为 2011-03-08。
【示例2-8】下面某表的字段a的数据类型是DATE类型, 向表中插入'1949-10-01'、'1950#2#3'、'1951@3@4'和'19520101'。其显示结果如下:
结果显示,'1949-10-01'保持原样的保存到字段中;'1950#2#3'转换为1950-02-03; '1951@3@4'转换为 1951-03-04; '19520101'转换为 1952-01-01。
虽然MySQL支持DATA类型的一些不严格的语法格式。但是,在实际应用中, 最好还是选择标准形式。日期中使用做分隔符,时间用“:”做分隔符。如 果有特殊需要,可以使用“@”、"*”等特殊字符做分隔符。
DATETIME类型使用8个字节来表示日期和时间。MySQL中以'YYYY-MM-DD HH:MM:SS'的形式显示DATETIME类型的值。从其形式可以看出.,DATETIME类型可 以直接用DATE类型和TIME类型组合而成。
给DATETIME类型的字段赋值的表示方法 如下: 'YYYY-MM-DDHH:MM:SS'或'YYYYMMDDHHMMSS'格式的字符串表示。 这种方式可以表达的范围是 41000-01-01 00:00:00'〜'9999-12-31 23:59:59'。 例如,输入 2008-08-08 08:08:08 , DATETIME 类型转换为 2008-08-08 08:08:08; 输入'20080808080808',同样转换为 2008-08-08 08:08:08。
MySQL中还支持一些不严格的语法格式,任何标点都可以用来做间隔符。情况与 DATE类型相同。而且,时间部分也可以用任意分隔符隔开,这与TIME类型不同。TIME 类型只能用“:”隔开。例如,输入'2008@08@08 080808',同样转换为2008-08-08 08:08:08。 【示例2-9]下面某表的字段a的数据类型是DATETIME类型,向表中插入 '1949-10-01 11:11:11'、'1950#2#3 11+11+11'和'19510101121212' ,其显示结果如下。
结果显示,'1949-10-01 11:11:11'直接存储到字段中;'1950#2#3 11+11+11'转换 为 1950-02-03 11:11:11; '19510101121212'转换为 1951-01-01 12:12:12。
TIMESTAMP类型使用4个字节来表示日期和时间。
TIMESTAMP类型的范围是从 1970-01-01 08:00:01—2038-01-19 11:14:07。MySQL 中也是以'YYYY-MM-DD HH:MM:SS' 的形式显示TIMESTAMP类型的值。
从其形式可以看出,TIMESTAMP类型与DATETIME类型显示的格式是一样的。给TIMESTAMP类型的字段赋值的表示方法基本与DATETIME类型相同。值得注意的是,TIMESTAMP类型范围比较小,没有DATETIME类型的范围 大。因此,输入值时要保证在TIMESTAMP类型的有效范围内。 【示例2-10】下面某表的字段a的数据类型是TIMESTAMP类型,向表中插入 1979-10-01 11:11:11'、,1970#2#3 11+11+11'、19710101121212'、28-01-01、'33@1@1 1111*11'、'790101121212'、20080808080808090101080808、0 和 NOW()。 其显示结果如下:
结果显示,'1970#2#3 11+11+11 转换为 1970-02-03 11:11:11; '33@1@1 111111' 转换为 2033-01-01 11:11:11:090101080808 转换为 2009-01-01 08:08:08;0转换为 0000-00-00 00:00:00; NOW。转换为系统当前时间。
2.1.4 字符串类型★★★★★
字符串类型是在数据库中存储字符串的数据类型。字符串类型包括CHAR、VARCHAR, BLOB、TEXT、ENUM和SET。 1.CHAR类型和VARCHAR类型
CHAR类型和VARCHAR类型都是在创建表时指定了最大长度,其基本形式如下:
其中,"字符串类型”参数指定了数据类型为CHAR类型还是VARCHAR类型;M 参数指定了该字符串的最大长度为M。例如,CHAR(4)就是指数据类型为CHAR类型,其 最大长度为4。
CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0-255的任意值。 例如,CHAR(IOO)就是指定CHAR类型的长度为100。
VARCHAR类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可 以取0〜65535之间的任意值。指定VARCHAR类型的最大值以后,其长度可以在。到最 大长度之间。 例如,VARCHAR(IOO)的最大长度是100。但是,不是每条记录都要占用100 个字节。而是在这个最大值范围内,使用多少分配多少。VARCHAR类型实际占用的空间 为字符串的实际长度加1。这样,即可有效节约系统的空间。
【示例2-11】下面向CHAR(5)与VARCHAR(5)中存入不同长度的字符串。将数据库 中的存储形式和占用的字节数进行对比,如表2.4所示。
表 2.4 CHAR(5)与VARCHAR(5)的对比
插入值 | CHAR(5) | 占用字节数 | VARCHAR(5) | 占用字节数 |
---|---|---|---|---|
'' | <, | 5个字节 | '' | 1个字节 |
'1' | '1' | 5个字节 | '1' | 2个字节 |
'123' | ‘123, | 5个字节 | ‘123' | 4个字节 |
'123 ' | '123' | 5个字节 | '123' | 5个字节 |
‘12345’ | '12345' | 5个字节 | '12345' | 6个字节 |
表2.4显示,CHAR(5)所占用的空间都是5个字节。这表示CHAR(5)的固定长度就是 5个字节。而VARCHAR(5)所占的字节数是实际长度的基础上加1。因为字符串的结束标志符占用了 1个字节。从表的第三行可以看到,VARCHAR将字符串'123 '最后面的空格依然保留着。为了确认空格是否保留,将所有数据后面加上“*”字符,结果显示如下:
由此可见,VARCHAR类型将'123 '最后面的空格保留着。而CHAR类型中将,123后面的空格自动删除了。 注意:如果CHAR和VARCHAR的长度为5,而插入的值为*123456'。那么系统会 阻止这个值的插入,并且会报错。错误信息是“ERROR 1406 (22001): Data too long for column”。这说明插入的字符串的长度已经大于了可以插入的最大值。
TEXT类型是一种特殊的字符串类型。TEXT只能保存字符数据,如新闻的内容等。 TEXT 类型包括 TINYTEXT. TEXT、MEDIUMTEXT 和 LONGTEXTo 下面将从 4 种 TEXT 类型允许的长度和存储空间进行对比,如表2.5所示。
表2.5各种TEXT类型的对比
类 型 | 允许的长度 | 存储空间 |
---|---|---|
TINYTEXT | 0-255字节 | 值的长度+2个字节 |
TEXT | 0-65535 字节 | 值的长度+2个字节 |
MEDIUMTEXT | 0—167772150 字节 | 值的长度+3个字节 |
LONGTEXT | 0-4294967295 字节 | 值的长度+4个字节 |
从表2.5可以看出,各种TEXT类型的区别在于允许的长度和存储空间不同。因此在 这几种TEXT类型中,根据需求选取既能满足需要又最节约空间的类型即可。
2.2 如何选择数据类型
在MySQL中创建表时,需要考虑为字段选择哪种数据类型是最合适的。只有选择了合适的数据类型,才能提高数据库的效率。本小节将讲解选择数据类型的原则。
2.2.1 整数类型和浮点数类型★★★★
整数类型和浮点数类型最大的区别在于能否表达小数。整数类型不能表示小数,而浮 点数类型可以表示小数。不同的整数类型的取值范围不同。TINYINT类型的取值范围为0〜 255。如果字段的最大值不超过255,那选择TINYINT类型就足够了。BIGINT类型的取值 范围最大。最常用的整数类型是INT类型。 浮点数类型包括FLOAT类型和DOUBLE类型。DOUBLE类型的精度比FLOAT类型 高。如果需要精确到小数点后10位以上,就应该选择DOUBLE类型,而不应该选择FLOAT类型。
2.2.2 浮点数类型和定点数类型★★★★
对于浮点数和定点数,当插入值的精度高于实际定义的精度时,系统会自动进行四舍 五入处理。其目的是为了使该值的精度达到要求。浮点数进行四舍五入时系统不会报警, 定点数会岀现警告。 在未指定精度的情况下,浮点数和定点数有其默认的精度。FLOAT型和DOUBLE型 默认会保存实际精度。这个精度与操作系统和硬件的精度有关。DECIMAL型默认整数位 为10,小数位为0,即默认为整数。 在MySQL中,定点数精度比浮点数要高。而且,浮点数会岀现误差。如果要对数据 的精度要求比较高,应该选择定点数。
2.2.3 char类型和varchar类型★★★★★
CHAR类型的长度是固定的,而VARCHAR类型的长度是在范围内可变的。因此, VARCHAR类型占用的空间比 CHAR类型小。 而且,VARCHAR类型比CHAR类型灵活。 对于长度变化比较大的字符串类型,最好是选择VARCHAR类型。 虽然CHAR类型占用的空间比较大,但是CHAR类型的处理速度比VARCHAR快。 因此,对于长度变化不大和查询速度要求较高的字符串类型,最好选择CHAR类型。
2.3创建表
创建表是指在已存在的数据库中建立新表。这是建立数据库最重要的一步,是进行其他表操作的基础。
2.3.1 创建表的语法形式★★★★
MySQL中,创建表是通过SQL语句CREATE TABLE实现的。其语法形式如下。
CREATE TABLE 表名(属性名 数据类型[完整性约束条件],
属性名 数据类型[完整性约束条件],
:
属性名 数据类型 );
其中,“表名”参数表示所要创建的表的名称;“属性名”参数表示表中字段的名称; "数据类型"参数指定字段的数据类型,“完整性约束条件”参数指 定字段的某些特殊约束条件。 注意;在使用CREATE TABLE语句创建表时,首先要使用USE语句选择数据库。选择数据库语句的基本格式为“USE数据库名”。如果没有选择数据库,创建表时 会出现 aERROR 1046 (3D000): No database selected"错误。 表名不能为SQL语言的关键字,如create、update和order等都不能做表名。一个表中可以有一个或多个属性。定义时,字母大小写均可,各属性之间用逗号隔开,最后一个属性后不需要加逗号。
【示例3-1】 下面创建一个表名为exampleO的表,SQL代码如下:
CREATE TABLE example0(id INT, name VARCHAR(20), sex BOOLEAN );
表3.1完整性约束条件表
约束条件 | 说 明 |
---|---|
PRIMARY KEY | 标识该属性为该表的主键,可以唯一的标识对应的元组 |
FOREIGN KEY | 标识该属性为该表的外键,是与之联系的某表的主键 |
NOT NULL | 标识该属性不能为空 |
UNIQUE | 标识该属性的值是唯一的 |
AUTO INCREMENT | 标识该属性的值自动增加,这是MySQL的SQL语句的特色 |
DEFAULT | 为该属性设置默认值 |
2.3.2 设置表的主键★★★
主键的主要目的是帮助MySQL以最快的速度查找到表中的某一条信息。主键必须满 足的条件就是主键必须是唯一的,表中任意两条记录的主键字段的值不能相同;主键的值是非空值。主键可以是单一的字段,也可以是多个字段的组合。
1.单字段主键 主键是由一个字段构成时,可以直接在该字段的后面加上PRIMARY KEY来设置主 键。语法规则如下:
属性名数据类型PRIMARY KEY
其中,“属性名”参数表示表中字段的名称;“数据类型”参数指定字段的数据类型。 【示例3-2】 下面在example 1表中设置stu_id作为主键,SQL代码如下:
CREATE TABLE example1 (
stujd INT PRIMARY KEY,
stu_name VARCHAR(20),
stu_sex BOOLEAN
);
代码运行后,example1表中包含3个字段。stu_id字段是整型;stu_name字段是字符 串型;stu_sex是布尔型。其中,stu_id字段是主键。
2.多字段主键 主键是由多个属性组合而成时,在属性定义完之后统一设置主键。语法规则如下: PRIMARY KEY(属性名1,属性名2,…,属性名n) 【示例3-3】下面在example2表中设置stu id与course id两个字段为主键,SQL代码 如下:
CREATE TABLE example2(
stu_id INT,
coursejd INT,
grade "FLOAT,
PRIMARY KEY(stu_id, coursejd)
);
代码运行后,example2表中包含3个字段。其中,stu_id和course id两个字段成为主键;stu id和course_id两者的组合可以确定唯一的一条记录。
2.3.3 设置表的外键★★★
外键的作用是建立该表与其父表的关联关系。父表中删除某条信息时,子表中与之对应的信息也必须有相应的改变。
【示例3-4】下面在example3表中设置stu_id和course_id为外键。与之相关联的是 example 1表中的主键stu id和course_id。SQL代码如下:
CREATE TABLE example3(
id INT PRIMARY KEY,
stu_id INT,
coursejd INT,
CONSTRAINT c_fk FOREIGN KEY (stu_id, coursejd) REFERENCES example2(stu_id, coursejd)
);
注意:子表的外键关联的必须是父表的主键。而且,数据类型必须是一致。例如,两者都是INT类型,或者都是CHAR类型。如果不满足这样的要求,在创建子表时, 就会出现"ERROR 1005 (HY000): Can't create table"错误。
2.3.4 设置表的非空约束★★★
非空性是指字段的值不能为空值(NULL)。非空约束将保证所有记录中该字段都有值。
下面在example4表中设置字段id和name的非空约束。SQL代码如下:
CREATE TABLE example4(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL
);
2.3.5 设置表的唯一性约束★★★
唯一性是指所有记录中该字段的值不能重复出现。设置表的唯一性约束是指在创建表时,为表的某些特殊字段加上UNIQUE约束条件。唯一性约束将保证所有记录中该字段的值不能重复出现。
【示例3-6】下面在examples表中设置字段id和stu_id的唯一性约束。SQL代码如下:
CREATE TABLE example5(
id INT PRIMARY KEY,
stujd INT UNIQUE,
name VARCHAR(20) NOT NULL
);
2.3.6 设置表的属性的默认值★★★
在创建表时可以指定表中字段的默认值。如果插入一条新的记录时没有为这个字段赋值,那么数据库系统会自动为这个字段插入默认值。默认值是通过DEFAULT关键字来设置的。
CREATE TABLE example7(
id INT PRIMARY KEY AUTO_INCREMENT,
stujd INT UNIQUE,
name VARCHAR(20) NOT NULL,
English VARCHAR(20) DEFAULT 'zero'
);
2.4 查看表结构
2.4.1查看表结构★★★
SHOW CREATE TABLE example1
查看表结构是指查看数据库中已存在的表的定义。查看表结构的语句包括DESCRIBE语句和SHOW CREATE TABLE语句。通过这两个语句,可以查看表的字段名、字段的数据类型和完整性约束条件等。
DESCRIBE example1;
DESC examplel;
代码运行后,结果显示如下:
2.4.2 查看表的详细结构SHOW CREATE TABLE★★★
SHOW CREATE TABLE example1
技巧:如果直接使用SHOW CREATE TABLE examplel语句,结果的显示效果会比较差。尤其是遇到内容比较长的记录,显示的结果会很混乱。代码最后加上“\G” 参数,可以更加美观的显示内容,对内容比较长的记录效果尤为明显。
2.5修改表
修改表是指修改数据库中已存在的表的定义。修改表比重新定义表简单,不需要重新加载数据,也不会影响正在进行的服务。MySQL中通过ALTER TABLE语句来修改表。 修改表包括修改表名、修改字段数据类型、修改字段名、增加字段、删除字段、修改字段 的排列位置、更改默认存储引擎和删除表的外键约束等
2.5.1 修改表名★★★
SHOW CREATE TABLE example1
表名可以在一个数据库中唯一的确定一张表。数据库系统通过表名来区分不同的表。
ALTER TABLE 旧表名 RENAME 新表名;
2.5.2 修改字段的数据类型★★★★
SHOW CREATE TABLE example1
SHOW CREATE TABLE example1
字段的数据类型包括整数型、浮点数型、字符串型、二进制类型、日期和时间类型等。
ALTER TABLE 表名 MODIFY 属性名 数据类型;
2.5.3 修改字段名★★★
SHOW CREATE TABLE example1
段名可以在一张表中唯一的确定一个字段。数据库系统通过字段名来区分表中的不同字段.
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;
2.5.4增加字段★★★
SHOW CREATE TABLE example1
増加无完整性约束条件的字段
ALTER TABLE 表名 ADD 字段名 数据类型;
増加有完整性约束条件的字段
ALTER TABLE user ADD age INT(4) NOT NULL:
2.5.5删除字段★★★
SHOW CREATE TABLE example1
删除字段是指删除已经定义好的表中的某个字段。
ALTER TABLE 表名 DROP 字段名;
2.5.6修改字段的排列位置★★★
SHOW CREATE TABLE example1
字段修改到第一个位置
ALTER TABLE user MODIFY name VARCHAR(30) FIRST:
字段修改到指定位置
ALTER TABLE user MODIFY sex TINYINT(1) AFTER phone;
2.6删除表
删除表是指删除数据库中已存在的表。删除表时,会删除表中的所有数据。
2.6.1删除没有被关联的普通表★★★★
DROP TABLE 表名;
2.6.2删除被其他表关联的父表★★★★
执行ALTER TABLE语句,删除 example4表的外键约束。删除example4表的外键的SQL语句如下:
ALTER TABLE example4 DROP FOREIGN KEY d_fk;
查询结果显示,example4表中已经不存在外键了。现在,已经消除了 example4表与 example1表的关联关系,即可直接使用DROP TABLE语句删除example1表。SQL代码如下:
DROP TABLE example1;
四、本单元知识总结
1.Mysql的数据类型
2.如何选择数据类型
3.创建和删除数据库
4.修改数据库