文章目录
-
- [1 创建表](#1 创建表)
- [2 创建users表](#2 创建users表)
- [3 查看表结构](#3 查看表结构)
- [3.4 修改表](#3.4 修改表)
- [3.5 删除表](#3.5 删除表)
在MySQL数据库日常开发中,表是数据存储的核心载体。无论是创建表、查看结构,还是修改字段、删除表,每一步操作都有规范的语法和潜在的坑点。本文介绍MySQL表的完整操作...
1 创建表
创建表是数据存储的第一步,需明确列名、数据类型、字符集和存储引擎,语法结构固定且严谨。
语法格式
sql
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
关键说明
field
:表的列名,需体现列的业务含义(如id
表示主键、name
表示用户名);datatype
:列的数据类型(如int
存整数、varchar(20)
存短字符串、date
存日期);(后续会详细讲解数据类型)character set
:表的字符集(若不指定,默认继承所在数据库的字符集);collate
:字符校验规则(若不指定,默认继承数据库规则);engine
:存储引擎(MySQL常用MyISAM
和InnoDB
,两者文件存储差异极大)。
注意: 不同存储引擎在磁盘上生成的文件不同,若不清楚差异,可能误删或找不到数据:
- 当存储引擎为
MyISAM
时,会生成3个文件:表名.frm
:存储表结构;表名.MYD
:存储表数据;表名.MYI
:存储表索引;
- 当存储引擎为
InnoDB
时(MySQL 5.7及以上),会生成2个文件:表名.frm
:存储表结构;表名.ibd
:存储表数据+索引(InnoDB将数据和索引融合存储)。
2 创建users表
以创建"用户表users
"为例,指定存储引擎为MyISAM
、字符集为utf8
,包含用户ID、用户名、加密密码、生日字段。
SQL
sql
create table users (
id int,
name varchar(20) comment '用户名', -- 注释说明字段含义,便于维护
password char(32) comment '密码是32位的md5值', -- MD5加密后固定32位,用char更高效
birthday date comment '生日'
) character set utf8 engine MyISAM;

验证
执行上述SQL后,在MySQL数据目录(如C:\ProgramData\MySQL\MySQL Server5.7\Data\test1
)中,会看到3个文件:
文件名 | 类型 | 作用 | 大小 |
---|---|---|---|
users.frm |
FRM文件 | 存储users 表结构 |
9KB |
users.MYD |
MYD文件 | 存储users 表数据 |
0KB(暂无数据) |
users.MYI |
MYI文件 | 存储users 表索引 |
1KB |

3 查看表结构
创建表后,需确认表结构是否符合预期,MySQL提供desc
命令快速查看列名、类型、是否允许为空等信息。
语法与示例
sql
-- 语法:desc 表名;
desc users;

字段分析
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(11) | YES | NULL | ||
name | varchar(20) | YES | NULL | ||
password | char(32) | YES | NULL | ||
birthday | date | YES | NULL |
各列含义:(如果是初学者了解即可,数据类型会详解)
Field
:列名;Type
:列的数据类型(如int(11)
表示整数,varchar(20)
表示最大20位字符串);Null
:是否允许为空(YES
表示允许,NO
表示不允许);Key
:是否为索引(空表示非索引,PRI
表示主键,UNI
表示唯一索引);Default
:默认值;Extra
:额外信息(如auto_increment
表示自增)。
其他语句
-
desc
与show create table
:
desc
仅显示简化的表结构,若需查看完整创建语句(含字符集、存储引擎),需用show create table 表名;
,例如:sqlshow create table users;
执行后会返回完整的
CREATE TABLE
语句,便于复现表结构。

3.4 修改表
实际开发中,表结构常需调整(如加字段、改类型、删列、改表名),MySQL用ALTER TABLE
命令实现,不同修改场景语法不同,且需注意数据安全性
3.4.1 添加字段
需求:在users
表的birthday
字段后,新增assets
字段存储图片路径。
SQL
sql
-- 语法:ALTER TABLE 表名 ADD 字段名 类型 [comment '注释'] [after 已有字段名];
alter table users add assets varchar(100) comment '图片路径' after birthday;

验证
-
查看修改后的结构:
sqldesc users;
会新增
assets
列,位于birthday
之后:Field Type Null Key Default Extra ... ... ... ... ... ... birthday date YES NULL assets varchar(100) YES NULL -
对原有数据无影响:
sqlselect * from users;
原有2条数据的
assets
列值为NULL
(新增字段默认无值),但不会丢失旧数据:id name password birthday assets 1 a b 1982-01-04 NULL 2 b c 1984-01-04 NULL
3.4.2 修改字段类型/长度
需求:将name
字段的长度从varchar(20)
改为varchar(60)
(应对更长的用户名需求)。
SQL
sql
-- 语法:ALTER TABLE 表名 MODIFY 字段名 新类型;
alter table users modify name varchar(60);

验证
sql
desc users;

name
字段的Type
会变为varchar(60)
,原有用户名数据不会丢失。
3.4.3 删除字段(谨慎操作!)
需求:删除password
字段(假设密码存储逻辑变更,不再需要该列)。
SQL
sql
-- 语法:ALTER TABLE 表名 DROP 字段名;
alter table users drop password;

验证
sql
desc users;

password
列会被彻底删除,且该列的所有数据也会丢失,无法恢复!
3.4.4 修改表名
需求:将users
表改名为employee
(表的业务含义变更)。
SQL
sql
-- 语法:ALTER TABLE 旧表名 RENAME [TO] 新表名;(TO可省略)
alter table users rename to employee;

验证
sql
-- 查看新表名的数据
select * from employee;
会正常返回原users
表的数据,表名已更新。
3.4.5 修改列名
需求:将employee
表的name
列改名为xingming
,保持类型为varchar(60)
。
SQL
sql
-- 语法:ALTER TABLE 表名 CHANGE 旧列名 新列名 完整类型;(必须指定完整类型)
alter table employee change name xingming varchar(60);

验证
sql
desc employee;
name
列会变为xingming
,类型仍为varchar(60)
。

区别分析
-
MODIFY
与CHANGE
:MODIFY
:仅修改字段类型/长度,不修改列名,语法为MODIFY 字段名 新类型
;CHANGE
:可同时修改列名和类型,语法为CHANGE 旧列名 新列名 完整类型
(必须写新列名和完整类型,缺一不可);
错误示例:用change
改长度却不写新列名:
sql-- 错误!CHANGE必须指定旧列名和新列名 alter table employee change name varchar(60);
-
添加字段时未指定位置,默认在最后 :
若不写
after 已有字段名
,新增字段会默认放在表的最后一列。若需指定位置(如在id
后),需明确写after id
,例如:sqlalter table employee add age int comment '年龄' after id;
3.5 删除表
当表不再需要时,可使用DROP TABLE
命令删除,但表的结构、数据、索引会全部删除,无法恢复。
语法格式
sql
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...;
TEMPORARY
:仅删除临时表(避免误删永久表);IF EXISTS
:若表不存在,不报错(否则会报"表不存在"错误);- 可同时删除多个表,用逗号分隔。
SQL
sql
drop table employee;

验证
sql
#查看表数据
select * from employee;
