2. 创建与管理数据表

空~2022年8月22日
  • MySQL
大约 7 分钟

2. 创建与管理数据表

在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。

每一行代表唯一的记录,每一列称为一个字段,每一列都有一个与其它列不重复的名称,称为字段名。数据表中的一列由一组字段值组成,若某个字段的值出现重复,该字段称为普通字段,若某个字段的值不允许重复,该字段称为索引字段。

MYSQL 常用数据类型

MySQL 中常用的数据类型有数值类型、字符串类型、日期和时间类型、二进制数据类型、逻辑类型。

数值类型

类型存储要求取值范围(有符号)取值范围(无符号)用途
TINYINT[(M)]1byte-128~1270~255小整数值
SMALLINT[(M)]2byte-32768~327670~65535大整数值
MEDIUMINT[(M)]3byte-8388608~83886070~16777215大整数值
INT 或 INTEGER[(M)]4byte-2147683648~21476836470~4294967295大整数值
BIGINT[(M)]8byte-9223372036854775808~92233730368547758070~18446744073709551615极大整数值
FLOAT[(M,D)]4byte(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值
DOUBLE[(M,D)]8byte(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度浮点数值
DECIMAL(M,D)mbyte依赖于 M 和 D 的值依赖于 M 和 D 的值小数值

MySQL 的 5 种整型:TINYINTSMALLINTMEDIUMINTINTBIGINT。这些整数型可定义为 UNSIGNED(无符号),从而禁用负值。

MySQL 中的 3 种浮点类型不能定义为 UNSIGNED

M:一个 1~255 的整数,表示用来显示列中的字符数。

D:一个 0~30 的整数,表示小数位数。

字符串类型

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65535 bytes二进制形式的长文本数据
TEXT0-65535 bytes长文本数据
MEDIUMBLOB0-16777215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4294967295 bytes二进制形式的极大文本数据
LONGTEXT0-4294967295 bytes极大文本数据

定长字符串存储长度固定,需要在创建的时候指定。

日期和时间类型

类型大小范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

插入当前系统时间,可以插入 CURRENT_TIMECURRENT_DATENOW()

创建数据表

创建数据表之前应该先使用:

USE 数据库名

指定操作的数据库。

在 MySQL 中,可以使用:CREATE TABLE语句创建表。其语法格式为:

CREATE TABLE <表名> ([表定义选项]) [表选项] [分区选项];

其中,[表定义选项]的格式为:

<列名 1> <类型 1> [,…] <列名 n> <类型 n>

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

CREATE TABLE 语句的主要语法及使用说明如下:

  • CREATE TABLE:用于创建给定名称的表,必须拥有表 CREATE 的权限。

  • <表名>:指定要创建表的名称,在 CREATE TABLE 之后给出,必须符合标识符命名规则。

    表名称被指定为 db_name.tbl_name,以便在特定的数据库中创建表。

    无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 db-name

    如果使用加引号的识别名,则应对数据库和表名称分别加引号。

    例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法。

  • <表定义选项>:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。

  • 默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。

提示

使用 CREATE TABLE 创建表时,必须指定以下信息:

  • 要创建的表的名称不区分大小写,不能使用 SQL 语言中的关键字,如 DROPALTERINSERT 等。
  • 数据表中每个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。
  • 查看数据表结构

    数据表建好之后可以查看表结构的定义,查看表结构可以使用:DESCRIBESHOW CREATE TABLE语句。

    DESCRIBE/DESC 语句可以查看表的字段信息,包括字段名、字段数据类型、是否为主键、是否有默认值等,语法规则如下:

    DESCRIBE <表名>;

    或简写成:

    DESC <表名>;

202208222018134

其中,各个字段的含义如下:

  • Null:表示该列是否可以存储 NULL 值。

  • Key:表示该列是否已编制索引。PRI 表示该列是表主键的一部分,UNI 表示该列是 UNIQUE 索引的一部分,MUL 表示在列中某个给定值允许出现多次。

  • Default:表示该列是否有默认值,如果有,值是多少。

  • Extra:表示可以获取的与给定列有关的附加信息,如 AUTO_INCREMENT 等。

  • 查看表的详细结构

SHOW CREATE TABLE 语句可以用来显示创建表时的 CREATE TABLE 语句,语法格式如下:

SHOW CREATE TABLE <表名>\G;

202208221940350

提示:使用 SHOW CREATE TABLE 语句不仅可以查看创建表时的详细语句,而且可以查看存储引擎和字符编码。如果不加\G参数,显示的结果可能非常混乱,加上\G参数之后,可使显示的结果更加直观,易于查看;但是在图形化工具上使用可能会报错!

管理数据表

修改表结构

在 MySQL 中可以使用 ALTER TABLE 语句来改变原有表的结构,例如增加或删减列、更改原有列类型、重新命名列或表等。
其语法格式如下:

ALTER TABLE <表名> [修改选项]

修改选项的语法格式如下:

{

ADD COLUMN <列名> <类型>

| CHANGE COLUMN <旧列名> <新列名> <新列类型>

| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }

| MODIFY COLUMN <列名> <类型>

| DROP COLUMN <列名>

| RENAME TO <新表名>

| CHARACTER SET <字符集名>

| COLLATE <校对规则名>

}

修改表名

MySQL 通过 ALTER TABLE 语句来实现表名的修改,语法规则如下:

ALTER TABLE <旧表名> RENAME [TO] <新表名>;

其中,TO 为可选参数,使用与否均不影响结果。

修改表字符集

MySQL 通过 ALTER TABLE 语句来实现表字符集的修改,语法规则如下:

ALTER TABLE 表名 [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校对规则名>;

其中,DEFAULT 为可选参数,使用与否均不影响结果。

利用 SELECT 语句查询的结果创建表

CREATE 语句后指定一个 SELECT 语句

例如:

CREATE TABLE someBook(

bid INT,

bname VARCHAR(80)

)

SELECT bid bname FROM bookInfo;

执行结果是将 bookInfo 表中 bid 列和 bname 列中的数据复制到 someBook 中。

复制表的数据:

CREATE TABLE book1 SELECT * FROM bookInfo;

创建一个一样的空表:

CREATE TABLE book2 SELECT * FROM bookInfo WHERE 0;

DROP TABLE 语句删除数据表

使用 DROP TABLE 语句可以删除一个或多个数据表,语法格式如下:

DROP TABLE [IF EXISTS] 表名 1 [ ,表名 2, 表名 3 ...]

对语法格式的说明如下:

  • 表名 1, 表名 2, 表名 3 ...表示要被删除的数据表的名称。DROP TABLE 可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。

  • IF EXISTS 用于在删除数据表之前判断该表是否存在。如果不加 IF EXISTS,当数据表不存在时 MySQL 将提示错误,中断 SQL 语句的执行;加上 IF EXISTS 后,当数据表不存在时 SQL 语句可以顺利执行,但是会发出警告(warning)。

提示

  • 用户必须拥有执行 DROP TABLE 命令的权限,否则数据表不会被删除。

  • 表被删除时,用户在该表上的权限不会自动删除。