二级MySQL数据库程序设计(三)

课程目录
第1章 数据库的基本概念与设计方法
第2章 MySQL简介
第3章 数据库和表
第4章 表数据的基本操作
第5章 数据库的查询
第6章 索引
第7章 视图
第8章 数据完整性约束与表维护语句
第9章 触发器
第10章 事件
第11章 存储过程与存储函数
第12章 访问控制与安全管理
第13章 备份与恢复
第14章 PHP和MySQL数据库编程
第15章 开发实例

本章学习流程图

在这里插入图片描述

本章学习大纲

在这里插入图片描述

3. 数据库和表

3.1 创建与使用数据库

在这里插入图片描述

3.1.1 创建数据库

注意:在对MySQL数据库进行任何操作之前,都需要连接数据库。
在MySQL中,可以使用CREATE DATABASE语句创建数据库,其语法格式如下:

create database[IF NOT EXISTS]<数据库名>;

语法说明:

  • <数据库名>:创建数据库的名称。
  • IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才执行操作。可以用来避免数据库已经存在而重复创建的错误。
  • 在一般语法格式描述中使用如下符号:
    < >:表示在语句中必须指定数据对象,是不可缺少的。
    [ ]:表示可以根据需要进行选择,也可以不选。
    |:表示多个选项只能选其一。
    { }:表示必选项。

3.1.2 选择数据库

语法格式:

USE <数据库名>;

语法说明:
USE<数据库名>可以通知MySQL把<数据库名>所示的数据库作为当前数据库。该数据库保持为默认数据库,知道语段的结尾,或者直到发布一个不同的USE语句。

3.1.3 修改数据库

语法格式:

ALTER DATABASE [数据库名] {[DEFAULT] CHARACTER SET <字符集名> | [DEFAULT] COLLATE <校对规则名>}

语法说明:

  • ALTER DATABASE用于更改数据库的全局特性。这些特性储存在数据库目录中的db.opt文件中。
  • 使用 ALTER DATABASE,需要获得数据库 ALTER 权限。
  • 数据库名称可以忽略,此时,语句对应于默认数据库。
  • CHARACTER SET子句用于更改默认的数据库字符集。

3.1.4 删除数据库

当需要删除已创建的数据库时,可以使用DROP DATABASEDROP SCHEMA语句。
语法格式:

DROP DATABASE [IF EXISTS] <数据库名>

语法说明:

  • <数据库名>:指定要删除的数据库名。
  • IF EXISTS:用于防止当数据库不存在时发生错误。
  • DROP DATABASE:删除数据库中的所有表格和同时删除数据库。使用此语句时要非常小心,一面错误删除。如果要使用DROP DATABASE,需要获得数据库DROP权限。

3.1.5 查看数据库

语法格式:

SHOW DATABASES [LIKE<数据库名>]

语法说明:

  • LIKE:可选项LIKE从句用于匹配指定的数据库名称。
  • SHOW DATABASES:查看当前用户权限范围内的数据库。

3.2 创建和操纵表

在这里插入图片描述
表是数据库中存放的最基本的数据对象。如果没有表,数据库也就没有意义。

3.2.1 创建表

语法格式:

CREATE TABLE<表名>([表定义选项])[表选项][分区选项];
[表定义选项]
<列名1><类型1>[,......]<列名n><类型n>

CREATE TABLE命令语法比较多,主要是由表创建定义(create-definition)、表选项(table-options)和分区选项(partition-options)组成。

【例】在一个已有的数据库mytest中新建一个包含姓名、性别、年龄、专业、联系方式等字段的学生基本信息表,要求将字段student_id号指定为该表的主键,并使用InnoDB引擎存储表数据。

mysql> create table students(student_id int not null auto_increment,
    -> student_name char(50) not null,
    -> student_sex char(1) not null default 0,
    -> student_major char(50) not null,
    -> student_contact char(50) null,
    -> primary key(student_id)
    -> )engine = InnoDB;
Query OK, 0 rows affected (1.05 sec)

查看下结果:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 0       |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

表创建基础

  • CREATE TABLE:用于创建给定名称的表。必须拥有表CREATE权限。
  • <表名>:指定要创建表的名称,在CREATE TABLE之后给出,必须符合标识符命名规则。
  • <表定义选项>:表创建定义,由列名(col_name)、列的定义(col_definition),以及可能的空值声明、完整约束或表索引组成。
  • 默认的情况是,表被创建到当前的数据库中。如果表已存在,或者没有当前数据库,或者数据库不存在,则会出现错误。

数据类型
数据类型:是指系统中所允许的数据的类型。
MySQL的数据类型分别有:数值类型、日期和时间类型、字符串类型、空间数据类型等。

(1)数值类型

  • BIT [ (M) ]:位字段类型。M表示每个值的位数,范围从1到64。如果M被省略,默认为1。
  • TINYINT [ (M) ] [UNSIGNED] [ZEROFILL]:很小的整数。带符号的范围是-128到127。无符号的范围是0到255。
  • BOOL,BOOLEAN:是TINYINT(1)的同义词。zero值被视为假。非zero值被视为真。
  • SMALLINT [ (M) ] [UNSIGNED] [ZEROFILL]:小的整数。带符号的范围是 -32 768到 32 767。无符号的范围是0到 65 535。
  • MEDIUMINT [ (M) ] [UNSIGNED] [ZEROFILL]:中等大小的整数。带符号的范围是 -8 388 608 到 8 388 607 。无符号的范围是 0到 16 777 215 。
  • INT [ (M) ] [UNSIGNED] [ZEROFILL]:普通大小的整数。带符号的范围是 -2 147 483 648 到 2 147 483 647 。无符号的范围是0到 4 294 967 295 。
  • INTEGER [ (M) ] [UNSIGNED] [ZEROFILL]:这个是INT的同义词。
  • BINGINT [ (M) ] [UNSIGNED] [ZEROFILL]:大整数。带符号的范围是 - 9 233 372 036 854 775 808 到 9 233 372 036 854 775 807。无符号的范围是0到 18 446 744 073 709 551 615 。
  • FLOAT [ (M,D) ] [UNSIGNED] [ZEROFILL]:小(单精度)浮点数。允许的值是 -3.402823466E+38 到 -1.175494351E-38、0和 1.175494351E-38 到 3.402823466E+38 。M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。如果指定UNSIGNED,不允许负值。
  • DOUBLE [ (M,D) ] [UNSIGNED] [ZEROFILL]:普通大小(双精度)浮点数。允许的值是 -1.7976931348623157E+308 到 -2.2250738585072014E-308、0和 2.225073858072014E-308 到 1.7976931348623157E+308 。M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。如果指定UNSIGNED,不允许负值。
  • DECIMAL [ (M [,D]) ] [UNSIGNED] [ZEROFILL]:压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和(负数)的“-”符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65.支持的十进制数的最大位数(D)是30。如果D被省略,默认是0。如果M被省略,默认是10。如果指定UNSIGNED,不允许负值。
  • DEC:DECIMAL同义词。

(2)日期和时间类型

  • DATE:日期型。支持的范围为 ‘1000-01-01’ 到 ‘9999-12-31’ 。MySQL以’YYYY-MM-DD’格式显示DATE值,但允许使用字符串或数字为DATE列分配值。
  • DATETIME:日期和时间的组合。支持的范围是 ‘1000-01-01 00:00:00’ 到 ‘9999-12-12 23:59:59’ 。MySQL以’YYYY-MM-DD HH:MM:SS’格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。
  • TIMESTAMP[ (M) ]:时间戳。范围是’1970-01-01 00:00:00’到2037年。TIMESTAMP列用于INSERTUPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。TIMESTAMP值返回后显示为’YYYY-MM-DD’ HH:MM:SS’格式的字符串,显示宽度固定19个字符。如果想要获得数字值,应在TIMESTAMP列添加+0 。
  • TIME:时间型。范围是’-838:59:59’ 到 ‘838:59:59’。MySQL以 ‘HH:MM:SS’ 格式显示TIME值,但允许使用字符串或数字为TIME列分配值。
  • YEAR [ (2|4) ]:两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000 。在两位格式中,允许的值是70到69,表示从1970年到2069年。MYSQL以YYYY格式显示YEAR值,但允许使用字符串或数字为YEAR列分配值。

(3)字符串类型

  • CHAR[ (m) ]:定长字符串,用于保存文本格式存储的信息,MySQL会分配固定的存储空间来存储CHAR,范围是0到255个字符。
  • VARCHAR[ (m) ]:可变长字符串,用于保存文本格式存储的信息,范围是0到 65 535 。
  • TINYBLOB:最大长度为255(2^8 -1)字节的BLOB列。
  • TINYTEXT:最大长度为255(2^8 -1)字节的TEXT列。
  • BLOB[ (m) ]:最大长度为65 535(2^16 -1)字节的BLOB列。
  • TEXT[ (m) ]:最大长度为65 535(2^16 -1)字节的TEXT列。
  • ENUM ( ‘value1’,‘value2’,…):枚举类型。只能有一个值的字符串被选出。ENUM列最多可以有65535个互不相同的值。ENUM值在内部用整数表示。

在字符数据类型和数值类型之后,MySQL允许指定一个数据类型选项用来改变数据类型的属性和功能。对于字符型数据类型,MySQL支持两种数据类型选项,即CHARACTER SET 和 COLLATE,如果要区分字符的大小写,可以在字符类型后面加上BINGARY;对于出BIT以外的数值数据类型,MySQL允许添加一个或多个数据类型选项,UNSIGNED指定不允许负值,ZEROFILL指定当插入的值长度小于字段设定的长度时,剩余部分用0填补。

AUTO_INCREMENT的使用
在MySQL中,关键字AUTO_INCREMENT用于为列设置自增属性,只有整形列才能设置此属性。当插入NULL值或者数字0到一个AUTO_INCREMENT列中时,该列的值会被设置为value+1,这里的value是此前表中该列的最大值。AUTO_INCREMENT顺序从数字1开始。每个表只能有一个AUTO_INCREMENT列,并且它必须被索引。

指定默认值
在MySQL中,默认值是指在向表中插入数据时,如果没有明确给出某个表列所对应的值,此时MySQL允许为此表列指定一个值。
BLOB和TEXT类型的列不能被赋予默认值。如果没有列指定默认值,MySQL会自动为其分配一个默认值。如果列可以取NULL值,如果列被声明NOT NULL,那么默认值就取决于列的类型。

  • 对于没有声明AUTO_INCREMENT属性的数字类型,默认值是0;对于一个AUTO_INCREMENT列,默认值是在顺序中的下一个值。
  • 除TIMESTAMP以外的日期和时间类型,默认值是该类型适当的“零”值;对于表中第一个TIMESTAMP列,默认值是当前的日期和时间。
  • 对于ENUM类型,默认值是第一个枚举值;除ENUM的字符串类型,默认值是空字符串。

NULL值
NULL值是没有值或缺值。允许NULL列也允许插入时不给出该列的值。不允许NULL值的列不接受该列值为NULL,插入时必须要有值。
需要注意的是,不要讲NULL值和空串混淆,NULL值是没有值,不是空串。因此在NOT NULL中插入’’(两个单引号,其间没有字符)是可以的。因为’'表示空串,而空串也是一个有效的值。

注意:NULL和空串的区别。NULL是该字段数据没有值,而空串代表的是该字段有值。

主键
CREATE TABLE语句中,主键是通过PRIMARY KEY关键字来指定的。当创建或更改表时,可以通过定义PRIMARY KEY约束来创建主键。一个表只能有一个PRIMARY KEY约束,而且PRIMARY KEY约束中的列不接受空值。由于PRIMARY KEY约束确保唯一数据,所以经常用来定义标识列。
主键:一个列或列的组合,其值能唯一地表示表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。

引擎类型
MySQL支持多种类型的数据库引擎,可分别根据各引擎的功能和特性,为不同的数据库处理任务提供各自不同的适应性和灵活性。在MySQL中,可以利用SHOW ENGINES语句来显示可用的数据库引擎和默认引擎。
InnoDB是系统的默认引擎,其支持可靠的事务处理。在MySQL中,可以在CREATE TABLE语句中使用ENGINE选项为新建表指定数据库引擎。

3.2.2 更新表

在这里插入图片描述
在MySQL中,可以使用ALTER TABLE语句来改变原有表的结构,增加或删减列、创建或取消索引、更改原有列类型、重新命名列或表等。

常用语法格式如下:

ALTER TABLE<表名>[修改选项]
[修改选项]
{ADD COLUMN <列名><类型>}
|CHANGE COLUMN<旧列名><新列名><新列类型>
|ALTER COLUMN<列名>{SET DEFAULT<默认值>|DROP DEFAULT}
|MODIFY COLUMN<列名><类型>
|DROP COLUMN<列名>
|RENAME TO<新表名>}

ADD [COLUMN]子句

用于向表中增加新列,可同时增加多个列。

【例】:向表students中添加一列,并且命名为student_from,用于描述学生的生源地,要求不能是NULL,且该列位于原表列student_sex列之后。

alter table students add column student_from char(10) not null after student_sex;

结果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 0       |                |
| student_from    | char(10) | NO   |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+

通过AFTER关键字想表中指定的列之后插入新列,也可以采用FIRST关键字将新列插入到表的第一页。如果没有指定AFTER或者FIRST,默认将新列插入到原表的最后。

CHANGE [COLUMN]子句

可同时修改表中指定列的名称和数据类型。
ALTER TABLE语句中可以同时放入多个CHANGE [COLUMN]子句,彼此间用逗号分隔。

【例】将数据库中表students的student_from列重命名为student_city,且数据类型改为char(20),允许为NULL。

mysql> alter table students change column student_from student_city char(20) null;

结果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 0       |                |
| student_city    | char(20) | YES  |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

注意:如果将列的数据类型改变为另外一种类型,可能会丢失该列原有的数据。如果视图改变的数据类型与原有的数据类型不兼容,则SQL命令不会执行,且系统会提示错误。在类型兼容的情况下,该列的数据可能会被截断。例如:数据类型从varchar(20)改为char(2),则原有数据“Beijing”被截取为“Be”。

ALTER [COLUMN]子句

可以修改或删除表中指定列的默认值。

【例】将数据库中表students的student_sex列的默认值改为1(代表“女”)。

mysql> alter table students alter column student_sex set default 1;

结果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_name    | char(50) | NO   |     | NULL    |                |
| student_sex     | char(1)  | NO   |     | 1       |                |
| student_city    | char(20) | YES  |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MODIFY [COLUMN]子句

可以修改制定列的数据类型,但是不会干涉它的列名。

【例】将数据库中表students的student_name列的数据类型由char(50)更改为char(20),并且将此列设置成表的第一列。

mysql> alter table students modify student_name char(20) first;

结果如下:

mysql> desc students;
+-----------------+----------+------+-----+---------+----------------+
| Field           | Type     | Null | Key | Default | Extra          |
+-----------------+----------+------+-----+---------+----------------+
| student_name    | char(20) | YES  |     | NULL    |                |
| student_id      | int      | NO   | PRI | NULL    | auto_increment |
| student_sex     | char(1)  | NO   |     | 1       |                |
| student_city    | char(20) | YES  |     | NULL    |                |
| student_major   | char(50) | NO   |     | NULL    |                |
| student_contact | char(50) | YES  |     | NULL    |                |
+-----------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

DROP [COLUMN]子句

用来删除表中的列。

数据表中的列越多,DBMS的工作负荷会越大,数据占用的空间也会越大,因而必要的时候需要规范数据表,删除表中多余的列。一旦列删除,原本储存在该列的一切数据都会被同时删除。
【例】删除表 students 的 student_contact 列。

mysql> alter table students drop column student_contact;

结果如下:

mysql> desc students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

RENAME [TO]子句

可以为表重新赋予一个表名。

【例】重新命名表 students 的表名为 university_students。

mysql> alter table students rename to university_students;

结果如下:

mysql> desc university_students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.3 重命名表

除了ALTER TABLE命令,还可以直接用RENAME TABLE语句来更改表的名字。

语法格式:

RENAME TABLE <表名> TO <新表名>

语法说明:

  • <表名>:修改之前的名字。
  • <新表名>:修改之后的名字。
  • RENAME TABLE可以同时命名多个表。

【例】使用RENAME TABLE将数据库中的 university_students 表重新命名为 students 。

mysql> rename table university_students to students;

结果如下:

mysql> desc students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.4 复制表

使用CREATE TABLE命令创建的语句,存在着另外一种语法结构,其实质是在旧表的基础上创建一份该表的拷贝,也就是复制表。

语法格式:

CREATE TABLE <表名> [LIKE | AS <就表名>]

语法说明:

  • LIKE:LIKE关键字可以创建一个和<旧表>表结构相同的新表,其中列名、数据类型、空指定和索引都将复制到新表,但是表的内容不会复制,因此创建的是一个和原表结构相同的空表。
  • AS:如果在复制表结构的同时,复制表的内容,可以使用AS子句来完成。使用AS子句可以复制表的内容,但索引和完整性约束不会被复制。

【例】在数据库中创建一份表 students 的拷贝 students_copy。

mysql> create table students_copy like students;

结果如下:

mysql> desc students_copy;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.5 删除表

当删除一个表的时候,可以使用DROP TABLE语句来完成。

语法格式:

DROP TABLE <表名> [, <表名1>, <表名2>]...

语法说明:

  • <表名>:被删除的表名。DROP TABLE语句可以同时删除多个表,用户必须拥有该命令的权限。
  • 表被删除时,所有的表数据和表定义会被取消,所以使用本语句要小心。
  • 表被删除时,用户在该表上的权限并不会自动被删除。

【例】删除数据库中的表 students_copy。

mysql> drop table students_copy;

结果如下:

mysql> show tables;
+-------------------+
| Tables_in_my_test |
+-------------------+
| employee          |
| students          |
+-------------------+
2 rows in set (0.18 sec)

3.2.6 查看表

在MySQL中,查看表包括 显示表的名称显示表的结构

显示表的名称
可以使用SHOW TABLES语句显示指定数据库存放的所有表名。

语法格式:

SHOW TABLES [ FROM <数据库名>][LIKE <模式>]

【例】显示数据库my_test中所有的表。

mysql> use my_test;
Database changed

mysql> show tables;
+-------------------+
| Tables_in_my_test |
+-------------------+
| employee          |
| students          |
+-------------------+
2 rows in set (0.00 sec)

显示表的结构
可以使用SHOW COLUMNS语句来显示指定数据表的结构。

语法格式:

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name][LIKE 'pattern']

【例】显示数据库my_test中表students的结构。

mysql> show columns from students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.15 sec)

MySQL支持用DESCRIBEDESC作为SHOW COLUMNS FROM的一种快捷方式。上述语句可以使用DESC达到同样的效果:

mysql> desc students;
+---------------+----------+------+-----+---------+----------------+
| Field         | Type     | Null | Key | Default | Extra          |
+---------------+----------+------+-----+---------+----------------+
| student_name  | char(20) | YES  |     | NULL    |                |
| student_id    | int      | NO   | PRI | NULL    | auto_increment |
| student_sex   | char(1)  | NO   |     | 1       |                |
| student_city  | char(20) | YES  |     | NULL    |                |
| student_major | char(50) | NO   |     | NULL    |                |
+---------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

3.2.7 表结构进阶

明确表的结构是成功创建表的关键。表的结构包含了表的名字,列名以及对应的数据类型和长度,是否可以为空值,默认值的指定,是否要使用约束,如何设置索引,哪些列指定为主键,哪些列指定为外键等。这里重点说明以下几点:

关于空值(NULL)
通常用于表示未知、不可用或将在以后添加的数据,切不可将它和数字0或字符类型的空字符混淆。向表中插入记录时,若一个列允许为空值的话,则可以不为该列指定具体的值;如果这个列不允许空值,则必须指定该列的具体值,否则插入数据库的时候,系统会提示出错。
注意:表的关键字是不允许为空值的。任意两个空值不相等。

关于列的标志(IDENTITY)属性
任何表都可以创建一个包含系统所生产序列号值的标识列。该序号值唯一标识表中的一列,且可以作为键值。每个表只能有一个列设置为标志属性,并且该列是能是DECIMAL、INT、NUMERIC、SMALLINT、BIGINT或TINYINT数据类型。定义标志属性时,可指定其中子值(起始值)、增量值,二者的默认数字均为1 。

关于列类型的隐含改变
在MySQL中,存在下面的一些情形,系统会隐含地改变在CREATE TABLE语句或ALTER TABLE语句中所指定的列的类型。

  • 长度小于4的VARCHAR类型会被改变为CHAR类型。
  • 只要在一个表中存在任何可变长度的列,都会使整个数据列变成变长的,因此当一张表包含任何变长的列时,如VARCHAR、TEXT、BLOB类型的列,该表中所有大于3个字符的其他CHAR类型列会被改变为VARCHAR类型列,同时不会影响用户如何使用这些列。这种改变的好处是节省空间,提升表操作的效率。
  • 由于TIMESTAMP类型列值的显示尺寸必须是偶数且在2~14范围内,若没有为其指定在这个范围之内,尺寸会被强制设为14,而1~13范围内的奇数值尺寸会被强制设为下一个更大的偶数。
  • 由于不能再TIMESTAMP类型列中存储空值NULL,因此当将该列的值设为NULL时,MySQL会默认设置为它的当前的日期和时间。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章