MySQL数据库,从入门到精通:第十篇——MySQL表创建和管理指南

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL数据库,从入门到精通:第十篇——MySQL表创建和管理指南

前言

在MySQL数据库中,创建和管理表是处理数据的重要部分。通过创建和管理表,我们可以更好地存储和查询数据,从而满足实际业务需求。本文将全面讲解MySQL中的创建和管理表的相关知识,包括数据类型、标识符命名规则、创建和管理数据库等方面,旨在帮助读者更好地了解和掌握MySQL中的表创建和管理。

摘要

本文主要分为八个部分。首先介绍MySQL中的基础知识,包括一条数据存储的过程、标识符命名规则和MySQL中常用的数据类型。接着,讲解创建和管理数据库的常用方法,包括创建数据库、使用数据库、修改数据库和删除数据库等。

在创建表方面,本文分别介绍了两种常用的创建方式,以及如何查看数据表结构,帮助读者更好地理解和掌握表的创建方法。在修改表方面,本文讲解了追加列、修改列、重命名列和删除列等操作方法。同时,还介绍了重命名表、删除表和清空表等相关操作。

最后,本文将进行内容拓展,介绍如何给表添加注释、如何导入和导出数据等实用技巧。通过本文的学习,读者可以更好地掌握MySQL中的表的创建和管理,提高数据库管理和查询效率。


第 10 篇_创建和管理表

1. 基础知识

1. 1 一条数据存储的过程

存储数据是处理数据的第一步。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只
能是一团乱麻,无从下手。

那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据

我们要先创建一个数据库,而不是直接创建数据表呢?

因为从系统架构的层次上看,MySQL 数据库系统从大小依次是数据库服务器、数据库、数据表、数据表的行与列。

MySQL 数据库服务器之前已经安装。所以,我们就从创建数据库开始。

1. 2 标识符命名规则

数据库名、表名不得超过 30 个字符,变量名限制为 29 个

必须只能包含 A–Z, a–z, 0 – 9 , _共 63 个字符

数据库名、表名、字段名等对象名中间不要包含空格 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名

必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使 用`(着重号)引起来

保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据

类型在一个表里是整数,那在另一个表里可就别变成字符型了

1. 3 MySQL中的数据类型

类型 类型举例
整数类型 TINYINT、SMALLINT、MEDIUMINT、 INT(或INTEGER) 、BIGINT
浮点类型 FLOAT、DOUBLE
定点数类型 DECIMAL
位类型 BIT
日期时间类型 YEAR、TIME、 DATE 、DATETIME、TIMESTAMP
文本字符串类型 CHAR、 VARCHAR 、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚举类型 ENUM
集合类型 SET
二进制字符串类型 BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
JSON类型 JSON对象、JSON数组
空间数据类型 单值:GEOMETRY、POINT、LINESTRING、POLYGON;集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION

其中,常用的几类类型介绍如下

数据类型 描述
INT 从-231到231-1的整型数据。存储大小为 4 个字节
CHAR(size) 定长字符数据。若未指定,默认为 1 个字符,最大长度 255
VARCHAR(size) 可变长字符数据,根据字符串实际长度保存, 必须指定长度
FLOAT(M,D) 单精度,占用 4 个字节,M=整数位+小数位,D=小数位D<=M<=255,0<=D<=30,默认M+D<=6
DOUBLE(M,D) 双精度,占用 8 个字节,D<=M<=255,0<=D<=30,默认M+D<=15
DECIMAL(M,D) 高精度小数,占用M+2个字节,D<=M<=65,0<=D<=30,最大取值范围与DOUBLE相同。
DATE 日期型数据,格式’YYYY-MM-DD’
BLOB 二进制形式的长文本数据,最大可达4G
TEXT 长文本数据,最大可达4G

2. 创建和管理数据库

2. 1 创建数据库

  • 方式 1 :创建数据库
CREATE DATABASE 数据库名;
  • 方式 2 :创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
  • 方式 3 :判断数据库是否已经存在,不存在则创建数据库(推荐)
CREATE DATABASE IF NOT EXISTS 数据库名;

如果MySQL中已经存在相关的数据库,则忽略创建语句,不再创建数据库。

注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。

2. 2 使用数据库

- 查看当前所有的数据库

SHOW DATABASES; #有一个S,代表多个数据库

- 查看当前正在使用的数据库

SELECT DATABASE(); #使用的一个 mysql 中的全局函数

- 查看指定库下所有的表

SHOW TABLES FROM 数据库名;

- 查看数据库的创建信息

SHOW CREATE DATABASE 数据库名;
或者:
SHOW CREATE DATABASE 数据库名\G

- 使用/切换数据库

USE 数据库名;

注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“数据库名.”。

2. 3 修改数据库

  • 更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集;  #比如:gbk、utf8等

2. 4 删除数据库

  • 方式 1 :删除指定的数据库
DROP DATABASE 数据库名;
  • 方式 2 :删除指定的数据库(推荐)
DROP DATABASE IF EXISTS 数据库名;

3. 创建表

3. 1 创建方式 1

  • 必须具备:

1.CREATE TABLE权限

2.存储空间

语法格式:

CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);

加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。

  • 必须指定:
    表名
    列名(或字段名),数据类型, 长度
  • 可选指定:
    约束条件
    默认值
  • 创建表举例 1 :
-- 创建表
CREATE TABLE emp (
-- int类型
emp_id INT,
-- 最多保存 20 个中英文字符
emp_name VARCHAR( 20 ),
-- 总位数不超过 15 位
salary DOUBLE,
-- 日期类型
birthday DATE
);
DESC emp;

MySQL在执行建表语句时,将id字段的类型设置为int(11),这里的 11 实际上是int类型指定的显示宽度,默认的显示宽度为 11 。也可以在创建数据表的时候指定数据的显示宽度。

  • 创建表举例 2 :
CREATE TABLE dept(
-- int类型,自增
deptno INT(2) AUTO_INCREMENT,
dname VARCHAR(14),
loc VARCHAR(13),
-- 主键
PRIMARY KEY (deptno)
)
DESCRIBE dept;

在MySQL 8.x版本中,不再推荐为INT类型指定显示长度,并在未来的版本中可能去掉这样的语法。

3. 2 创建方式 2

  • 使用 AS subquery 选项, 将创建表和插入数据结合起来

  • 指定的列和子查询中的列要一一对应
  • 通过列名和默认值定义列
CREATE TABLE emp1 AS SELECT * FROM employees;
CREATE TABLE emp2 AS SELECT * FROM employees WHERE 1 = 2 ; -- 创建的emp2是空表
CREATE TABLE dept
AS
SELECT employee_id, last_name, salary* 12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80 ;
DESCRIBE dept80;

3. 3 查看数据表结构

在MySQL中创建好数据表之后,可以查看数据表的结构。MySQL支持使用DESCRIBE/DESC语句查看数据表结构,也支持使用SHOW CREATE TABLE语句查看数据表结构。

语法格式如下:

SHOW CREATE TABLE 表名\G

使用SHOW CREATE TABLE语句不仅可以查看表创建时的详细语句,还可以查看存储引擎和字符编码。

4. 修改表

修改表指的是修改数据库中已经存在的数据表的结构。

使用 ALTER TABLE 语句可以实现:

  • 向已有的表中添加列
  • 修改现有表中的列
  • 删除现有表中的列
  • 重命名现有表中的列

4. 1 追加一个列

语法格式如下:

ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;

举例:

ALTER TABLE dept
ADD job_id varchar( 15 );

4. 2 修改一个列

  • 可以修改列的数据类型,长度、默认值和位置
  • 修改字段数据类型、长度、默认值、位置的语法格式如下:
ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
  • 举例:
ALTER TABLE dept80
MODIFY last_name VARCHAR(30);
ALTER TABLE dept80
MODIFY salary double(9,2) default 1000;
  • 对默认值的修改只影响今后对表的修改
  • 此外,还可以通过此种方式修改列的约束。这里暂先不讲。

4. 3 重命名一个列

使用 CHANGE old_column new_column dataType子句重命名列。语法格式如下:

ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;

举例:

ALTER TABLE dept80
CHANGE department_name dept_name varchar(15);

4. 4 删除一个列

删除表中某个字段的语法格式如下:

ALTER TABLE 表名 DROP 【COLUMN】字段名

举例:

ALTER TABLE dept
DROP COLUMN job_id;

5. 重命名表

方式一:使用RENAME

RENAME TABLE emp
TO myemp;

方式二:

ALTER table dept
RENAME [TO] detail_dept; -- [TO]可以省略

必须是对象的拥有者

6. 删除表

  • 在MySQL中,当一张数据表没有与其他任何数据表形成关联关系时,可以将当 -
  • 前数据表直接删除。
  • 数据和结构都被删除
  • 所有正在运行的相关事务被提交
  • 所有相关索引被删除
    语法格式:
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n]

IF EXISTS的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。

举例:

DROP TABLE dept80;

DROP TABLE 语句不能回滚

7. 清空表

  • TRUNCATE TABLE语句:
  • 删除表中所有的数据
  • 释放表的存储空间

举例:

TRUNCATE TABLE detail_dept;
  • TRUNCATE语句 不能回滚 ,而使用 DELETE 语句删除数据,可以回滚
  • 对比:
SET autocommit = FALSE;
DELETE FROM emp2;
#TRUNCATE TABLE emp2;
SELECT * FROM emp2;
ROLLBACK;
SELECT * FROM emp2;

阿里开发规范: 【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。

说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

8. 内容拓展

拓展 1 :阿里巴巴《Java开发手册》之MySQL字段命名

强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出

现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

  • 正例:aliyun_admin,rdc_config,level3_name
  • 反例:AliyunAdmin,rdcConfig,level_3_name

强制】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。

强制】表必备三字段:id, gmt_create, gmt_modified。

  • 说明:其中 id 必为主键,类型为BIGINT UNSIGNED、单表时自增、步长为 1 。gmt_create,gmt_modified 的类型均为 DATETIME 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新
    推荐】表的命名最好是遵循 “业务名称_表的作用”。
    正例:alipay_task 、 force_project、 trade_config
    推荐】库名与应用名称尽量一致。
    参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
  • 正例:无符号值可以避免误存负数,且扩大了表示范围。

拓展 2 :如何理解清空表、删除表等操作需谨慎?!

表删除操作将把表的定义和表中的数据一起删除,并且MySQL在执行删除操作时,不会有任何的确认信息提示,因此执行删除操时应当慎重。在删除表前,最好对表中的数据进行备份,这样当操作失误时可以对数据进行恢复,以免造成无法挽回的后果。

同样的,在使用 ALTER TABLE 进行表的基本修改操作时,在执行操作过程之前,也应该确保对数据进行完整的备份,因为数据库的改变是无法撤销的,如果添加了一个不需要的字段,可以将其删除;相同的,如果删除了一个需要的列,该列下面的所有数据都将会丢失。

拓展 3 :MySQL 8 新特性—DDL的原子化

在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即DDL操作要么成功要么回滚。DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到)

中,用于回滚操作。通过设置参数,可将DDL操作日志打印输出到MySQL错误日志中。

分别在MySQL 5.7版本和MySQL 8.0版本中创建数据库和数据表,结果如下:

CREATE DATABASE mytest;
USE mytest;
CREATE TABLE book1(
book_id INT ,
book_name VARCHAR(255)
);
SHOW TABLES;

( 1 )在MySQL 5.7版本中,测试步骤如下: 删除数据表book1和数据表book2,结果如下:

mysql> DROP TABLE book1,book2;
ERROR 1051 (42S02): Unknown table 'mytest.book2'

再次查询数据库中的数据表名称,结果如下:

mysql> SHOW TABLES;
Empty set (0.00 sec)

从结果可以看出,虽然删除操作时报错了,但是仍然删除了数据表book1。

( 2 )在MySQL 8.0版本中,测试步骤如下: 删除数据表book1和数据表book2,结果如下:

mysql> DROP TABLE book1,book2;
ERROR 1051 (42S02): Unknown table 'mytest.book2'

再次查询数据库中的数据表名称,结果如下:

mysql> show tables;
+------------------+
| Tables_in_mytest |
+------------------+
| book1 |
+------------------+
1 row in set (0.00 sec)


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
55 13
|
7天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
23 1
|
9天前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
26 4
|
10天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
24 4
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
83 1
|
19天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
61 2
|
4天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
33 0
|
17天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
1月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
126 6
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
61 3
Mysql(4)—数据库索引