上一篇讲了"库的操作",这一篇来系统掌握 MySQL **表(table)**的完整操作:创建表、查看表结构、修改表结构、删除表。特别是
ALTER TABLE的各种用法,是日常开发改动表结构的高频操作,一定得记牢。
一、创建表
MySQL 使用CREATE TABLE语句创建表,语法如下:
CREATETABLEtable_name(field1 datatype,field2 datatype,field3 datatype)characterset字符集collate校验规则engine存储引擎;语法说明:
field:表示列名;datatype:表示列的类型(如int、varchar、date);character set 字符集:如果不指定,则以所在数据库的字符集为准;collate 校验规则:如果不指定,则以所在数据库的校验规则为准;engine 存储引擎:决定表在磁盘上的存储方式(如MyISAM、InnoDB)。
二、创建表案例
createtableusers(idint,namevarchar(20)comment'用户名',passwordchar(32)comment'密码是32位的md5值',birthdaydatecomment'生日')charactersetutf8engineMyISAM;💡
comment用来给字段添加注释,方便后来者理解字段含义。
不同的存储引擎,建表生成的文件不一样
上面users表用的是MyISAM引擎,在数据目录下会生成三个文件:
| 文件 | 含义 |
|---|---|
users.frm | 表结构 |
users.MYD | 表数据 |
users.MYI | 表索引 |
打开数据目录(例如C:\ProgramData\MySQL\MySQL Server 5.7\Data\test1)可以看到:
| 名称 | 类型 | 大小 |
|---|---|---|
| db.opt | Option 文件 | 1 KB |
| person.frm | FRM 文件 | 9 KB |
| person.ibd | IBD 文件 | 96 KB |
| users.frm | FRM 文件 | 9 KB |
| users.MYD | MYD 文件 | 0 KB |
| users.MYI | MYI 文件 | 1 KB |
💡 备注:如果改成InnoDB引擎创建表,就不会有
.MYD/.MYI,而是.frm(表结构)+.ibd(表数据和索引一起存)两个文件。这也是 InnoDB 和 MyISAM 的直观区别。
三、查看表结构
desc表名;以users表为例:
mysql> 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 | 字段类型 |
| Null | 是否允许为空 |
| Default | 默认值 |
| Extra | 扩充信息(如自增) |
四、修改表
实际开发中经常要调整表结构:改字段名、改字段大小、改类型、改字符集、改存储引擎,甚至增删字段。这时就需要ALTER TABLE。
4.1 ALTER TABLE 通用语法
-- 添加字段ALTERTABLEtablenameADD(columndatatype[DEFAULTexpr][,columndatatype]...);-- 修改字段(修改类型/大小)ALTERTABLEtablenameMODIFY(columndatatype[DEFAULTexpr][,columndatatype]...);-- 删除字段ALTERTABLEtablenameDROP(column);4.2 实战案例
先给users表插入两条数据:
mysql>insertintousersvalues(1,'a','b','1982-01-04'),(2,'b','c','1984-01-04');① 添加一个字段(保存图片路径)
altertableusersaddassetsvarchar(100)comment'图片路径'afterbirthday;
after birthday表示把新字段插在birthday之后。
查看结果——新增字段对原表已有数据没有影响:
mysql> 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 | | | assets | varchar(100) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+ mysql> select * from users; +----+------+----------+------------+-------+ | id | name | password | birthday | assets | +----+------+----------+------------+-------+ | 1 | a | b | 1982-01-04 | NULL | -- 原数据仍然存在 | 2 | b | c | 1984-01-04 | NULL | +----+------+----------+------------+-------+② 修改 name 字段长度
altertableusersmodifynamevarchar(60);结果name从varchar(20)变成varchar(60)。
③ 删除 password 字段
altertableusersdroppassword;⚠️删除字段一定要小心!字段和它对应的列数据都会一起消失,无法恢复。
删除后结构:
+----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(60) | YES | | NULL | | | birthday | date | YES | | NULL | | | assets | varchar(100) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+④ 修改表名
altertableusersrenametoemployee;
to可以省略,等价于alter table users rename employee;。
改名后数据不丢失:
mysql> select * from employee; +----+------+------------+-------+ | id | name | birthday | assets | +----+------+------------+-------+ | 1 | a | 1982-01-04 | NULL | | 2 | b | 1984-01-04 | NULL | +----+------+------------+-------+⑤ 修改字段名
altertableemployee change name xingmingvarchar(60);⚠️ 用
change修改字段名时,新字段需要给出完整定义(类型必须带上,不能只写名字)。
结果:
+----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | xingming | varchar(60) | YES | | NULL | | | birthday | date | YES | | NULL | | | assets | varchar(100) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+五、删除表
语法:
DROP[TEMPORARY]TABLE[IFEXISTS]tbl_name[,tbl_name]...;示例:
droptablet1;⚠️ 删除表是不可逆操作,表结构和数据都会一并删除。
IF EXISTS加上可避免表不存在时报错;一次性可删除多张表,用逗号分隔。
六、总结
| 操作 | 命令 |
|---|---|
| 创建表 | create table 表名(字段 类型 ...) engine=存储引擎; |
| 查看表结构 | desc 表名; |
| 添加字段 | alter table 表名 add 字段 类型 [after 某字段]; |
| 修改字段类型/大小 | alter table 表名 modify 字段 新类型; |
| 修改字段名 | alter table 表名 change 旧名 新名 完整类型; |
| 删除字段 | alter table 表名 drop 字段; |
| 修改表名 | alter table 旧表名 rename to 新表名; |
| 删除表 | drop table [if exists] 表名; |
核心一句话:建表选好存储引擎(MyISAM 三文件 vs InnoDB 两文件),改表用ADD增、MODIFY改类型、CHANGE改名字、DROP删字段,删除类操作务必谨慎。
如果这篇对你有帮助,欢迎点赞收藏。本系列持续更新 MySQL 操作。有疑问欢迎评论区交流。