MySQL 创建和管理表


1. 基础知识

1.1 数据存储的过程

数据存储过程: 创建数据库 -> 确认字段 -> 创建数据表 -> 插入数据

从系统架构的层次上看,MySQL 数据库系统从大到小依次是数据库服务器、数据库、数据表、数据表的行与列,因此,从创建数据库开始


1.2 标识符命名规则

  1. 数据库名、表名不得超过30个字符变量名 限制为29个
  2. 必须只能包含 A--Z, a--z, 0--9, _共63个字符
  3. 数据库名、表名、字段名等对象名中间不要包含空格
  4. 同一个MySQL软件 中,数据库不能同名
  5. 同一个库 中,表不能重名
  6. 同一个表 中,字段不能重名
  7. 必须保证你的字段 没有和保留字、数据库系统或常用方法冲突
    如果坚持使用,请在SQL语句中使用 `(着重号)引起来
  8. 保持字段名和类型的一致性:
    在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可别变成字符型了
    理解:多表连接时,不同表中同名字段类型要一致

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 从-2³¹到2³¹-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,代表多个数据库
  • 使用/切换数据库
    USE 数据库名;
  • 查看使用中的数据库中的表
    SHOW TABLES;
  • 查看指定库下所有的表
    SHOW TABLES FROM 数据库名;
  • 查看当前正在使用的数据库
    SELECT DATABASE(); #使用的一个 mysql 中的全局函数
  • 查看数据库的创建信息
    SHOW CREATE DATABASE 数据库名;
    or
    SHOW CREATE DATABASE 数据库名\G

注意:

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


2.3 修改数据库

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

一般不建议更改,一般的使用场景是刚创建完数据库,发现字符集错了

  • 数据库不可改名,可视化工具中修改,一般是:建新库 -> 复制 -> 删库;

2.4 删除数据库

  • 方式1:删除指定的数据库
    DROP DATABASE 数据库名;
  • 方式2:删除指定的数据库( 推荐 )
    DROP DATABASE IF EXISTS 数据库名
    若删库失败,直接结束,不报错

3. 创建表

3.1 创建方式1

  • 必须具备
    • CREATE TABLE权限
    • 储存空间
  • 语法格式
sql 复制代码
CREATE TABLE IF NOT EXISTS 表名 ( 
	字段 1, 数据类型 [约束条件] [默认值], 
	字段 2, 数据类型 [约束条件] [默认值], 
	字段 3, 数据类型 [约束条件] [默认值], 
	...... 
	[表约束条件] 
);

若加上了IF NOT EXISTS关键字,则表示:

如果当前数据库中不存在要创建的数据表,则创建数据表;

如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表

  • 必须指定:

    • 表名
    • 列名(或字段名),数据类型,长度
  • 可选指定:

    • 约束条件
    • 默认值
  • eg:

sql 复制代码
CREATE TABLE myemp1(
	id INT,
	emp_name VARCHAR(15),
	hire_data DATE
);

VARCHAR用来定义字符串,需指明最大长度

字符集默认为数据库的字符集

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

也可以在创建数据表的时候指定数据的显示宽度

在MySQL 8.x版本中,不再推荐为INT类型指定显示长度,并在未来的版本中也没有这样的语法


3.2 创建方式二

  • 使用 AS subquery 选项,将创建表和插入数据结合起来
sql 复制代码
CREATE TABLE table
	[(column,column...)]
AS subquery;
  • 指定的列和子查询中的列要一一对应

  • 通过列名和默认值定义列

  • eg:使用查询结果创建新的表

sql 复制代码
CREATE TABLE myemp3
AS
SELECT last_name,salary
FROM employees;

查到的表是什么样的,创建的表就是什么样的

  • eg:创建employees_copy,实现对employees表的复制,包括数据
sql 复制代码
CREATE TABLE emp1 
AS
SELECT * 
FROM employees;
  • eg:创建employees_copy,实现对employees表的复制,不包括数据
sql 复制代码
CREATE TABLE emp2 
AS 
SELECT * 
FROM employees 
WHERE 1=2; -- 过滤条件永远不成立,则创建的emp2是空表

3.3 查看数据表结构

MySQL支持使用

  • DESCRIBE/DESC 语句
  • SHOW CREATE TABLE 语句
    查看数据表结构

语法格式:

SHOW CREATE TABLE 表名\G

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


4. 修改表

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

使用 ALTER TABLE 语句可以实现:

  1. 向已有的表中加列
  2. 现有表中的列
  3. 除现有表中的列
  4. 重命名现有表中的列

4.1 追加一个列

语法格式:

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

解释:

默认填到最后一列,FIRST添加在第一列,AFTER 字段名 -> 添加到某一列后

【】为可写可不写的意思

eg:

ALTER TABLE dept80 ADD job_id varchar(15);

默认添加在最后一列


4.2 修改一个列:数据类型、长度、默认值(略)

注:类型一般不改

语法格式:

ALTER TABLE 表名 MODIFY 【COLUMN】字段名1 字段类型【DEFAULT 默认值】【FIRST|AFTER 字段名 2】;

eg:

sql 复制代码
ALTER TABLE dept80 
MODIFY last_name VARCHAR(30);

eg:

sql 复制代码
ALTER TABLE dept80 
MODIFY salary double(9,2) default 1000;
  • 对默认值的修改只影响今后对表的修改
  • 还可以通过此种方式修改列的约束,这里暂先不说

4.3 重命名一个列

使用 CHANGE old_column new_column dataType子句重命名列

语法格式:

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

eg:

sql 复制代码
ALTER TABLE dept80 
CHANGE department_name dept_name varchar(15);

4.4 删除一个列

语法格式:

ALTER TABLE 表名 DROP 【COLUMN】字段名

eg:

sql 复制代码
ALTER TABLE dept80 
DROP COLUMN job_id;

5. 重命名表

  • 方式一:使用RENAME
sql 复制代码
RENAME TABLE 
emp TO myemp;
  • 方式二:
sql 复制代码
ALTER table dept 
RENAME [TO] detail_dept; -- [TO]可以省略

必须是对象的拥有者


6. 删除表

  • 在MySQL中,当一张数据表没有与其他任何数据表形成关联关系时,可以将当前数据表直接删除
  • 数据和结构都被删除
  • 所有正在运行的相关事务被提交
  • 所有相关索引被删除

语法格式:

DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, ..., 数据表n];

IF EXISTS 的含义为:

如果当前数据库中存在相应的数据表,则删除数据表;

如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作

eg:

DROP TABLE dept80;

  • 注意:DROP TABLE 语句不能回滚

7. 清空表

TRUNCATE TABLE 语句:

删除表中所有的数据

释放表的存储空间

语法格式:

TRUNCATE TABLE 数据表;

eg:

sql 复制代码
TRUNCATE TABLE detail_dept;

TRUNCATE语句不能回滚,而使用 DELETE 语句删除数据,可以回滚

阿里开发规范:

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

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


8. DCL 中 的 COMMIT 和 ROLLBACK

COMMIT(翻译:提交数据),一旦执行,数据就被永久的保存在了数据库中,数据不可回滚

ROLLBACK:回滚数据,一旦执行,实现数据回滚,回滚到最近的一次COMMIT 之后


9. 对比 TRUNCATE TABLE 和 DELETE FROM

相同点:都可以删除表中的所有数据,并保留表结构

不同点:

TRUNCATE TABLE 不可回滚

DELETE FROM 可回滚,带WHERE 可以选择性删除


10. DDL 与 DML 的说明

  • DDL 的操作一旦执行,操作之后,一定会执行一次COMMIT,因此不可回滚,
  • DML 的操作默认情况,一旦执行,也不可回滚
    但若在执行DML之前执行了,SET autocommit = FALSE(从自动提交改为不自动提交),则执行的DML操作就可以实现回滚
    注意,上面的指令对DDL无效

11. 内容拓展

11. 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

【推荐】库名与应用名称尽量一致。

【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。

  • 正例:无符号值可以避免误存负数,且扩大了表示范围。

11.2 如何理解清空表、删除表等操作需谨慎

MySQL没有确认信息提示,不能回滚操作需谨慎

删除表前最好先备份


11.3 MySQL8新特性---DDL的原子化

InnoDB表的DDL支持事务完整性,即 DDL操作要么成功要么回滚

解析(了解):DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到) 中,用于回滚操作。通过设置参数,可将DDL操作日志打印输出到MySQL错误日志中。

注:因此之前的版本不支持,如删除不存在的和存在的表,会报错,但同时存在的表还是会被删,MySQL8就不会


相关推荐
六月雨滴1 小时前
归档模式配置与切换
数据库·oracle·dba
卡次卡次11 小时前
vibecoding起步注意点:插件、Skills、MCP、Hooks
服务器·数据库·python·oracle
Elastic 中国社区官方博客2 小时前
每次操作一个 API 调用:Elastic Cloud Hosted 如何让大规模部署管理变得可行
大数据·运维·数据库·elasticsearch·搜索引擎·serverless
清溪5492 小时前
pgAdmin4 <= 9.1_RCE(CVE-2025-2945)复现
数据库·后端
清溪5492 小时前
pgAdmin4后台Restore RCE(CVE-2025-13780)复现
数据库·后端
煎饼皮皮侠2 小时前
【设计】设计一个web版的数据库管理平台后端(之三) -- 多数据库通用分页
数据库·web数据库·查询平台
Rick19932 小时前
mysql联合索引经典实例
java·数据库·mysql
anew___2 小时前
《数据库原理》精要解读(七)—— 数据库设计:从蓝图到现实的系统工程
数据库·oracle
独隅2 小时前
MySQL 接入不同 AI 大模型进行数据管理的全面指南(MySQL + AI)
数据库·人工智能·mysql