1. 创建表
1.1 基础语法
create table [if not exists] table_name (
field1 datatype,
field2 datatype,
field3 datatype
) [character set 字符集] [collate 校验规则] [engine 存储引擎];执行结果示例(执行成功无报错):
query ok, 0 rows affected (0.02 sec)
1.2 语法细节与规则说明
建表时可以加上 if not exists 判断同名表是否存在,存在就不创建,不存在才执行创建。
sql 换行与格式规则:sql 语法本身完全无视换行、空格和缩进,它只以分号;作为语句结束的标志,只要没有输入分号,无论在哪个位置按回车换行都不会影响语句的合法性和执行结果。
有三种情况不能随便拆分换行:
- 字符串:不能将单引号或双引号包裹的内容拆分成多行
- 数字:不能将一个完整的数字拆分成多行
- sql 关键字:不能将 select、from、where 等完整关键字拆分成多行
列定义末尾规则:括号内最后一个字段的定义结尾不用加逗号,直接跟右括号即可。
表级属性规则:括号后面可以指定字符集、校验规则、存储引擎;不写字符集和校验规则时,默认继承所在数据库的字符集和校验规则;不写存储引擎时,使用 mysql 全局默认存储引擎,存储引擎和后续的事务特性相关。不同存储引擎,表在磁盘上存储的文件数量、文件后缀都不相同。
1.3 参数说明
- field:表示列名(字段名)
- datatype:表示列的数据类型
- character set:表的字符集,如果没有指定,则以所在数据库的字符集为准
- collate:表的校验规则,如果没有指定,则以所在数据库的校验规则为准
1.4 创建表案例
create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine myisam;执行结果:
query ok, 0 rows affected (0.03 sec)
查看表结构确认创建成功:
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 | | +----------+-------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)
1.5 不同存储引擎的文件结构
不同的存储引擎,创建表后生成的磁盘文件不一样。
myisam 存储引擎:上述 users 表在数据库目录中会生成 3 个文件:
- users.frm:存储表结构
- users.myd:存储表数据
- users.myi:存储表索引
备注:创建一个 engine 是 innodb 的表,观察存储目录可以看到不同的文件结构。innodb 引擎在独立表空间模式下,会生成 表名.frm(表结构)和 表名.ibd(数据 + 索引共同存储)两个文件。
2. 查看表
2.1 查看当前库所有表
show tables;
执行结果示例(假设当前数据库中有 users 表):
mysql> show tables; +-------------------+ | tables_in_testdb | +-------------------+ | users | +-------------------+ 1 row in set (0.00 sec)
可以查看当前数据库中有哪些表。
2.2 查看表结构详情
desc 表名; -- 等价于 describe 表名;
执行结果示例(以 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 | | +----------+-------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)
用于查看某一张表的字段定义,返回结果共 6 列,各列含义如下:
| 列名 | 含义说明 |
|---|---|
| field | 字段名称,即表中列的名字 |
| type | 字段的数据类型及长度,例如 int(11)、varchar(20) |
| null | 表示该列是否允许为 null 值;yes 代表允许为空,no 代表不允许为空 |
| key | 索引类型标识;pri 代表主键索引,uni 代表唯一索引,mul 代表普通索引,为空则表示该列无索引 |
| default | 字段的默认值;插入数据时如果不指定该字段,会自动使用默认值填充 |
| extra | 字段的额外属性;常见的有 auto_increment(自增属性)等 |
查看时可先关注前两列,分别是列的字段名称和字段类型。
2.3 查看完整建表语句
show create table 表名; -- 末尾用 \g 替代分号,可纵向格式化打印,避免一行内容过长导致混乱 show create table 表名\g
执行结果示例(以 users 表为例):
mysql> show create table users \g
*************************** 1. row ***************************
table: users
create table: create table `users` (
`id` int(11) default null,
`name` varchar(20) default null comment '用户名',
`password` char(32) default null comment '密码是32位的md5值',
`birthday` date default null comment '生日'
) engine=myisam default charset=utf8
1 row in set (0.00 sec)关键说明:输出与原始建表语句不一致的原因
执行 show create table 打印出的建表语句,并不一定和你当时输入的建表指令完全一致,mysql 服务端(mysqld)会在内部对建表语句进行标准化优化处理后再存储和展示,具体优化内容包括:
- 语法标准化:统一关键字的大小写格式、补全省略的默认关键字(例如将简写的 charset 补全为 default charset),规范化括号、缩进与换行格式,输出标准可执行的完整 sql。
- 默认属性补全:自动补全你建表时省略的默认属性,比如你没有显式指定 null 约束,会自动补上 default null 等默认配置,保证输出的语句是完整、可直接执行的。
- 格式规整化:统一字段的换行对齐方式,把字符集、校验规则、存储引擎等表级属性统一放在语句末尾,整体格式规整。
- 等价语法转换:部分语法糖写法会被转换为标准 sql 写法,保证跨版本兼容性。
这个过程仅做语法和格式层面的标准化,不会修改表的实际结构与属性。
3. 修改表结构(alter table)
3.1 核心说明
修改表操作修改的是表的列属性、表结构定义,不是对表里面的数据进行操作,属于数据定义语言(ddl)范畴。
生产环境注意:表创建好之后尽量不要修改表结构。因为数据库在项目中是非常底层的依赖,容易牵一发而动全身,修改一个字段,很多上层的业务逻辑、代码、sql 语句可能都要跟着变动。
3.2 修改表的基础语法
(1)新增字段:add
alter table tablename add (column datatype [default expr][,column datatype]...);
(2)修改字段类型 / 属性:modify
alter table tablename modify (column datatype [default expr][,column datatype]...);
(3)删除字段:drop
alter table tablename drop (column);
3.3 操作案例
前置准备:在 users 表中插入两条测试数据
insert into users values(1,'a','b','1982-01-04'),(2,'b','c','1984-01-04');
案例 1:新增字段
在 users 表中添加 assets 字段,用于保存图片路径,指定放在 birthday 列的后面
alter table users add assets varchar(100) comment '图片路径' after birthday;
after 字段名:用于指定新增字段放在哪一列的后面
执行效果:插入新字段后,对原来表中的数据没有影响,原有行的新增字段值为 null。
案例 2:修改字段类型与长度
将 name 字段的长度修改为 60
alter table users modify name varchar(60);
执行效果:字段的类型、长度被新的定义直接覆盖;执行后再用 show create table 表名 \g 查看,会发现建表语句已经更新为最新的定义,原有的定义被直接覆盖。
案例 3:删除字段
删除 password 列
alter table users drop password;
注意:删除字段一定要谨慎,字段被删除后,该列对应的所有数据也会一并消失。
案例 4:修改表名
将表名 users 修改为 employee
alter table users rename to employee; -- to 关键字可以省略,等价于:alter table users rename employee;
底层原理:修改表名在 linux 系统底层等价于 move 系统调用(和 mv 命令效果类似),磁盘上对应的表文件名也会跟着修改,因此执行速度很快。
案例 5:修改字段名称
将 name 列修改为 xingming,同时保留字段类型定义
alter table employee change name xingming varchar(60);
注意:使用 change 修改字段名时,新字段需要给出完整的类型定义。
4. 删除表
4.1 语法格式
drop [temporary] table [if exists] tbl_name [, tbl_name] ...
4.2 示例
drop table t1;
- if exists:表存在时才执行删除,不存在则不报错
- 支持一次删除多张表,表名之间用逗号分隔
- 删除表会级联删除表结构、表数据、索引文件,操作不可逆,属于高危操作
到此这篇关于mysql 表结构操作的文章就介绍到这了,更多相关mysql表结构内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论