数据库中的表也是数据库服务结构中的重要组成部分;
环境准备-创建数据库
mysql > create database db01;
1、创建数据表信息
通过数据库服务管理工具,图形操作创建数据库表信息:
(1)依次点击【Schemas】-【db01】-【Tables】,右键选择【Create Table...】

(2)定义表名为【stu】,添加注释【学生表】,其他内容定义如下:
| Column Name | Datatype | 约束配置 | Default/Expression |
|---|---|---|---|
| id | INT | ||
| name | VARCHAR(45) | ||
| age | TINYINT | 18 | |
| gender | ENUM('男','女','其他') | 其他 |

(3)点击【apply】后,会将图形操作的配置信息转换为相应的建表语句

完整建表语句参考:
CREATE TABLE `student` (
`id` int NOT NULL COMMENT '学号信息',
`name` varchar(45) NOT NULL COMMENT '学生名',
`age` tinyint unsigned NOT NULL COMMENT '学生年龄',
`gender` enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '学生性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'
说明:企业中创建表建议使用第三方工具
创建表的基本语法格式:
create table <表名> (
<字段名1> <类型1> ,
…
<字段名n> <类型n>);
以上是创建表的具体格式信息,其中create table是关键字,不能更改,但是大小写可以变化。
实战情况:需要创建一个学生信息表:
# 创建数据库db14
mysql> create database db14;
# 切换数据库环境
mysql> use db14;
#查看是否切换数据库成功
mysql> select database();
+------------+
| database() |
+------------+
| db14 |
+------------+
1 row in set (0.00 sec)
# 创建数据表信息
mysql > create table stu1(
id int(10) not null,
name varchar(20) not null,
age tinyint(2) NOT NULL default '0',
dept varchar(16) default NULL
);
# 查看db14库下的所有数据表
mysql> show tables;
+----------------+
| Tables_in_db14 |
+----------------+
| stu1 |
+----------------+
1 row in set (0.00 sec)
# 查看表结构
mysql > desc stu1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| age | tinyint | NO | | 0 | |
| dept | varchar(16) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
# 获取创建表语句
mysql> show create table stu1\G
*************************** 1. row ***************************
Table: stu1
Create Table: CREATE TABLE `stu1` (
`id` int NOT NULL,
`name` varchar(20) NOT NULL,
`age` tinyint NOT NULL DEFAULT '0',
`dept` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
2、查看数据表信息
# 创建数据库db14
mysql> create database db14;
# 切换数据库环境
mysql> use db14;
# 查看数据库中所有表信息
mysql > show tables;
# 查看数据库中名字带t的表
mysql> show tables like '%t%';
# 查看数据库中指定表数据结构信息
mysql > desc stu1;
# 查看数据库中指定表创建语句信息
mysql > show create table stu1;
3、修改数据表信息
(1) 修改数据表属性信息
# 创建数据库db14
mysql> create database db14;
# 创建数据表信息
mysql > create table db14.stu1(
id int(10) not null,
name varchar(20) not null,
age tinyint(2) NOT NULL default '0',
dept varchar(16) default NULL
);
# 修改数据表名称信息
## 方式一
mysql> rename table stu1 to stu2;
## 方式二
mysql > alter table stu2 rename stu3;
# 查看表名称信息是否修改
mysql > show tables;
# 修改数据表编码信息,修改表结构中字符集编码信息
mysql > alter table db14.stu2 charset utf8mb4;
#查看表字符编码信息情况
mysql > show create table db14.stu2;
(2) 修改数据表结构信息
数据表结构调整命令语法
#利用alter在数据表中添加新的表结构字段
mysql > alter table <表名> add column <字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];
#利用alter在数据表中删除已有表结构字段
mysql > alter table <表名> drop column <字段名称>;
#利用alter在数据表中修改已有表结构字段(数据类型 约束与属性)
mysql > alter table <表名> modify column <字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];
#利用alter在数据表中修改已有表结构字段(字段名称 数据类型 约束与属性)
mysql > alter table <表名> change column <旧字段名称> <新字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];
#利用alter在数据表中删除已有表结构字段(约束与属性)
mysql > alter table <表名> drop index <字段名称> ;
具体实际操作过程(添加新的表结构字段)
# 创建数据库db14
mysql> create database db14;
# 创建数据表信息
mysql > create table db14.stu3(
id int(10) not null,
name varchar(20) not null,
age tinyint(2) NOT NULL default '0',
dept varchar(16) default NULL
);
#在学生表中,添加新的表结构字段列(追加字段列-单列操作)
mysql > alter table db14.stu3 add column telno char(11) not null unique key comment '手机号';
#在学生表中,添加新的表结构字段列(插入字段列-单列操作)
mysql > alter table db14.stu3 add column wechat varchar(64) not null unique key comment '微信号' after age;
#在学生表中,添加新的表结构字段列(插入首行列-单列操作)
mysql > alter table db14.stu3 add column sid int not null unique key comment '微信号' first;
#查看表结构字段信息变化
mysql> desc db14.stu3;
+--------+----------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------------+------+-----+---------+----------------+
| sid | int | NO | UNI | NULL | |
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(45) | NO | | NULL | |
| age | tinyint unsigned | YES | | 18 | |
| wechat | varchar(64) | NO | UNI | NULL | |
| gender | enum('男','女','其他') | YES | | 其他 | |
| telno | char(11) | NO | UNI | NULL | |
+--------+----------------------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)
具体实际操作过程(删除已有表结构字段)
#在学生表中,删除字段sid
mysql > alter table db14.stu3 drop column sid;
具体实际操作过程(修改已有表结构字段)
#在学生表中,修改已有表结构字段列(修改表结构数据类型)
mysql > alter table db14.stu3 modify name varchar(64);
#在学生表中,修改已有表结构字段列,最后带有保持原有配置的属性信息,否则其他属性信息会被还原为默认
mysql > alter table db14.stu3 modify name varchar(64) not null comment '学生名';
#在学生表中,修改已有表结构字段列(修改表结构字段名称)
mysql > alter table db14.stu3 change name stuname varchar(64) not null comment '学生名';
或者
mysql > alter table db14.stu3 change column name stuname varchar(64) not null comment '学生名';
#在学生表中,修改已有表结构字段列(修改表结构属性信息)了解即可
mysql > alter table db14.stu3 modify name varchar(64) not null unique comment '学生名称';
#在学生表中,修改已有表结构字段列(删除表结构属性信息)了解即可
mysql > alter table db14.stu3 drop index `name`;
#查看表结构字段信息变化
mysql > desc db14.stu3;
4、删除数据表信息
# 数据表删除命令语法
mysql > drop table <表名>;
# 删除操作过程,会将定义的表结构和表中数据内容一并删除
mysql > drop table db14.stu3;
# 删除操作过程,只是清空表中数据内容,但保留定义的表结构信息
mysql > truncate table db14.stu3;
数据定义语句定义数据表规范说明:
-
创建数据表名称规范:要和业务有关(含库前缀),不要有大写字母,不要数字开头,不要含有系统关键字信息,名称不要太长;
-
创建数据表属性规范:属性信息显示设置,引擎选择InnoDB,字符集选择utf8/utf8mb4,表信息添加注释;
-
创建数据列属性规范:名称要有意义,不要含有系统关键字信息,名称不要太长;
-
创建数据类型的规范:数据类型选择合适的、足够的、简短的;
-
创建数据约束的规范:每个表中必须都要有主键,最好是和业务无关列,实现自增功能,建议每个列都非空(避免索引失效)/加注释
-
删除数据表操作规范:对于普通用户不能具有删表操作,需要操作删表时需要严格审核
-
修改数据表结构规范:在数据库8.0之前,修改数据表结构需要在业务不繁忙时进行,否则会产生严重的锁
如果出现紧急修改表结构信息需求时,可以使用工具进行调整,比如使用:pt-osc、gh-ost,从而降低对业务影响
企业数据库面试题目分析练习:
01 请查看以下建表语句给出规范和优化建议:(物流公司日常工作表信息)
create table 't_area_distribution_cost' (
'id' bigint(20) not null auto_increment comment '主键',
'city_id' varchar(200),
'city_name' varchar(200),
'warehouse_id' varchar(200),
'warehouse_name' varchar(200) ,
'station_region_id' varchar(200),
'station_region_name' varchar(200),
'replenish_type' varchar(200),
'distribution_cost' varchar(200),
'c_t' varchar(200) default '0' comment '创建时间',
'create_user' varchar(200) default '0' comment '创建人ID',
'creater' varchar(200) comment '创建人',
'u_t' varchar(200) default '0' comment '修改时间',
'update_user' varchar(200) default '0' comment '修改人ID',
'updater' varchar(200),
'is_deleted' varchar(200) comment '删除标记(1 ,删除;0,不删除,有效)',
primary key ('id'),
key 'i_abc_city_id' ('city_id') comment '城市ID索引',
key 'i_abc_warehouse_id' ('warehouse_id'),
key 'i_abc_station_region_id' ('station_region_id')
) ENGINE=innodb default charset=utf8 comment='区域配送运费设置';
问题解答分析:
# 修改建议01:表明信息略长可以进行调整
create table 't_area_distribution_cost'
# 修改建议02:数据类型信息设定尽量合适
'city_id' varchar(200),
'city_name' varchar(200),
# 修改建议03:定义索引信息没有设置非空
'city_id' varchar(200),
'warehouse_id' varchar(200),
'station_region_id' varchar(200),
# 修改建议04:表中字段列信息可以加注释
'city_id' varchar(200),
'city_name' varchar(200),
'warehouse_id' varchar(200),
'warehouse_name' varchar(200) ,
'station_region_id' varchar(200),
02 研发同学需要紧急上线,需要DBA审核SQL,请问以下语句需要如何评估后上线执行,请写审核SQL要点
alter table t_enter_cooperate_info add account_day INT not null default 0 comment '账期天数',
alter table t_enter_cooperate_info add account_detay_day INT not null default 0 comment '账期付款天数',
alter table t_pop_basic add account_day INT not null default 0 comment '账期天数',
alter table t_pop_basic add account_detay_day INT not null default 0 comment '账期付款天数'
问题解答分析:
本身语句是没有任何问题的,但需要说明,尽量业务繁忙时不要进行发布,选择夜里业务不繁忙时进行发布;
在进行SQL语句信息审核时,需要了解SQL语句的含义和作用:
alter table t_enter_cooperate_info add account_day INT not null default 0 comment '账期天数',
alter table t_enter_cooperate_info add account_detay_day INT not null default 0 comment '账期付款天数',
-- 表示在t_enter_cooperate_info表中 添加两列信息 并设置相应属性和注释信息
alter table t_pop_basic add account_day INT not null default 0 comment '账期天数',
alter table t_pop_basic add account_detay_day INT not null default 0 comment '账期付款天数'
-- 表示在t_pop_basic add表中 添加两列信息 并设置相应属性和注释信息
通过对以上SQL语句信息解读,可以看出语句操作属于DDL操作,线上操作DDL语句可能会产生比较严重的锁进制等待(死锁问题);
可以结合企业的数据业务存储的负载压力(TPS),可能当前时间段的TPS数值较高,原则上不建议进行线上操作;
但是考虑到业务需求的紧急情况,建议使用PT-osc工具进行数据库线上操作,减少对线上业务的影响,但不能提高操作效率;