7.Mysql 快速建表,你学会了吗?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 7.Mysql 快速建表,你学会了吗?

表结构设计,不同的人设计不同,但是尽量规范,于人方便就是于已方便;本文主要介绍如何快速建表。

准备工作

创建一个用于存储表结构设计的表,名建表信息表,建表语法准备如下:

create database asset;
use asset;
drop table if exists table_desc_info;
create table if not exists table_desc_info
(
    id              int auto_increment primary key comment '自增id',
    db_name         varchar(255) default ''                not null comment '数据库名',
    tb_name         varchar(255) default ''                not null comment '表名',
    tb_desc         varchar(255) default '' comment '表描述',
    col_name        varchar(255) default ''                not null comment '字段名',
    col_desc        varchar(255) default '' comment '字段描述',
    col_type        varchar(255) default ''                not null comment '字段类型',
    def_value       varchar(255) default '' comment '默认值,需要写成 default 默认值',
    extra_condition varchar(255) default '' comment '额外条件',
    create_time     datetime     default current_timestamp not null comment '创建时间',
    update_time     datetime     default current_timestamp not null on update current_timestamp comment '修改时间'
) comment '建表信息表';

数据测试

查看我们新建的表结构信息,并且录入到table_desc_info表中;

-- 查看结构信息
desc asset.table_desc_info;
-- 数据录入
insert into table_desc_info(db_name, tb_name, col_name, col_desc, col_type, def_value, extra_condition)
select table_schema               as db_name,
       table_name                 as tb_name,
       '建表信息表'                 as tb_desc,
       column_name                as col_name,
       column_comment             as col_desc,
       column_type                as col_type,
       ifnull(column_default, '') as def_value,
       case
           when IS_NULLABLE = 'NO' and column_key = 'PRI' then 'auto_increment primary key'
           when IS_NULLABLE = 'NO' and column_key != 'PRI' then 'not null'
           else '' end               extra_condition
from information_schema.columns
where concat(table_schema, '.', table_name) = 'asset.table_desc_info'
order by ordinal_position;

稍微调整下信息,得到如下结果:

select db_name,tb_name,tb_desc,col_name,
       col_desc,col_type,def_value,extra_condition
from asset.table_desc_info;
+---------+-----------------+-----------------+----------------------+--------------------------------------------+--------------+---------------------------+--------------------------------------+
| db_name | tb_name         | tb_desc         | col_name             | col_desc                                   | col_type     | def_value                 | extra_condition                      |
+---------+-----------------+-----------------+----------------------+--------------------------------------------+--------------+---------------------------+--------------------------------------+
| asset   | table_desc_info | 建表信息表      | id                   | 自增id                                     | int          |                           | auto_increment primary key           |
| asset   | table_desc_info | 建表信息表      | db_name              | 数据库名                                   | varchar(255) |                           | not null                             |
| asset   | table_desc_info | 建表信息表      | tb_name              | 表名                                       | varchar(255) |                           | not null                             |
| asset   | table_desc_info | 建表信息表      | col_name             | 字段名                                     | varchar(255) |                           | not null                             |
| asset   | table_desc_info | 建表信息表      | col_desc             | 字段描述                                   | varchar(255) |                           |                                      |
| asset   | table_desc_info | 建表信息表      | col_type             | 字段类型                                   | varchar(255) |                           | not null                             |
| asset   | table_desc_info | 建表信息表      | def_value            | 默认值,需要写成 default 默认值            | varchar(255) |                           |                                      |
| asset   | table_desc_info | 建表信息表      | constraint_condition | 约束条件                                   | varchar(255) |                           |                                      |
| asset   | table_desc_info | 建表信息表      | create_time          | 创建时间                                   | datetime     | default current_timestamp | not null                             |
| asset   | table_desc_info | 建表信息表      | update_time          | 修改时间                                   | datetime     | default current_timestamp | not null on update current_timestamp |
+---------+-----------------+-----------------+----------------------+--------------------------------------------+--------------+---------------------------+--------------------------------------+

根据建表语句,我们只要构造拼接成正常的创建表语句就可以了,经过测试,得到如下代码和结果:

select concat('create table if not exists ','`',db_name,'`','.','`',tb_name,'`','(',char(10)
              ,substring(group_concat(a separator '\n'),2),char(10),') comment ','\'',tb_desc,'\';') ct_statement
from
(select db_name,
       tb_name,
       tb_desc,
       col_name,
       col_desc,
       col_type,
       def_value,
       extra_condition,
       concat( ',','`',col_name,'`',' ',col_type,' ',def_value,' ',extra_condition,' comment ','\'',col_desc,'\'') a
from asset.table_desc_info) t1
where concat(db_name,'.',tb_name) = 'asset.table_desc_info'
group by db_name,tb_name,tb_desc;
+------------------------------------------------------------------------------------------------------+
| create table if not exists `asset`.`table_desc_info`(
`id` int  auto_increment primary key comment '自增id'
,`db_name` varchar(255)  not null comment '数据库名'
,`tb_name` varchar(255)  not null comment '表名'
,`col_name` varchar(255)  not null comment '字段名'
,`col_desc` varchar(255)   comment '字段描述'
,`col_type` varchar(255)  not null comment '字段类型'
,`def_value` varchar(255)   comment '默认值,需要写成 default 默认值'
,`constraint_condition` varchar(255)   comment '约束条件'
,`create_time` datetime default current_timestamp not null comment '创建时间'
,`update_time` datetime default current_timestamp not null on update current_timestamp comment '修改时间'
) comment '建表信息表';
+-------------------------------------------------------------------------------------------------------+

都是基本的查询语句,cha(10)代表换行符,通过测试调整,最终结果与建表时一致,那么可以投入使用啦。

投入使用

将设计的表结构信息录入到asset.table_desc_info表中,也可以在Datagrip工具中直接像Excel上操作一样,填写好数据提交即可;

insert into asset.table_desc_info (db_name, tb_name, tb_desc, col_name, col_desc, col_type) values ('sql_auto', 'student_info', '学生信息表', 'student_id', '学生id', 'varchar(255)');
insert into asset.table_desc_info (db_name, tb_name, tb_desc, col_name, col_desc, col_type) values ('sql_auto', 'student_info', '学生信息表', 'student_name', '学生姓名', 'varchar(255)');
insert into asset.table_desc_info (db_name, tb_name, tb_desc, col_name, col_desc, col_type) values ('sql_auto', 'student_info', '学生信息表', 'age', '年龄', 'int');

然后我们试试刚测试的代码,这里通过变量存储下建表语句,再使用execute执行。

create datacreate database if not exists sql_auto;
set @ct_statement := (select concat('create table if not exists ','`',db_name,'`','.','`',tb_name,'`','(',char(10)
              ,substring(group_concat(a separator '\n'),2),char(10),') comment ','\'',tb_desc,'\';') ct_statement
from
(select db_name,
       tb_name,
       tb_desc,
       col_name,
       col_desc,
       col_type,
       def_value,
       extra_condition,
       concat( ',','`',col_name,'`',' ',col_type,' ',def_value,' ',extra_condition,' comment ','\'',col_desc,'\'') a
from asset.table_desc_info) t1
where concat(db_name,'.',tb_name) = 'sql_auto.student_info'
group by db_name,tb_name,tb_desc);
select @ct_statement;-- 查看变量语句情况
prepare stmt1 from @ct_statement;-- 准备语句
execute stmt1;-- 执行语句

-- 查看表是否创建和建表语句
show create table sql_auto.student_info;
+-----------------------------------------------------------------------------------------------+
| student_info | CREATE TABLE `student_info` (
  `student_id` varchar(255) DEFAULT NULL COMMENT '学生id',
  `student_name` varchar(255) DEFAULT NULL COMMENT '学生姓名',
  `age` int DEFAULT NULL COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生信息表'              |
+-----------------------------------------------------------------------------------------------+

以上就是数据库快速建表的操作,如果业务要对应地表结构设计,我们也可以很快的从数据库中导出;再如果表结构设计是在Excel中进行的,处理思路也是类似的,都是通过字符串拼接成需要的语句,同样也建议在设计过程中尽量规范,这样在以后需要设计大量表时,能更高效的处理。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 关系型数据库 MySQL
【MySQL】1-深入理解MySQL的索引机制
【MySQL】1-深入理解MySQL的索引机制
|
5月前
|
存储 SQL 关系型数据库
MySQL 索引
MySQL 索引
52 0
|
存储 关系型数据库 MySQL
MySQL 多表查询详解
MySQL 是一个强大的关系型数据库管理系统,多表查询是数据库操作中的重要部分之一。多表查询允许您从多个表中检索和操作数据,以满足复杂的数据需求。本文将介绍 MySQL 多表查询的基本概念、语法和示例,以及一些常见的多表查询场景。
600 0
|
5月前
|
存储 SQL 关系型数据库
MySQL 索引(下)
MySQL 索引(下)
|
5月前
|
关系型数据库 MySQL 数据库
【MySql】MySQL数据库--什么是MySQL的回表 ?
【MySql】MySQL数据库--什么是MySQL的回表 ?
111 0
【MySql】MySQL数据库--什么是MySQL的回表 ?
|
5月前
|
关系型数据库 MySQL 数据库
|
SQL 关系型数据库 MySQL
【Hello mysql】 mysql的索引(上)
【Hello mysql】 mysql的索引
56 0
【Hello mysql】 mysql的索引(上)
|
存储 关系型数据库 MySQL
【MySQL】MySQL分区表详解
【MySQL】MySQL分区表详解
313 0
|
存储 关系型数据库 MySQL
MySQL-索引
MySQL-索引
64 0
|
存储 关系型数据库 MySQL
【MySQL】不就是索引
嗨!小伙伴们周末快乐呀!想必你们周末都在家里边呆着吧,外面实在是太热了!在家里吹着空调做着自己喜欢做的事情吧!本期我们主要学习的是MySQL中的约束条件。
57 1