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

简介: 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中进行的,处理思路也是类似的,都是通过字符串拼接成需要的语句,同样也建议在设计过程中尽量规范,这样在以后需要设计大量表时,能更高效的处理。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
分布式计算 Java 关系型数据库
Linux中jar包启动和jar包后台运行的实现方式
Linux中jar包启动和jar包后台运行的实现方式
2722 0
|
JavaScript 中间件 测试技术
FastAPI全面指南:从入门到企业级应用实战
FastAPI正迅速成为Python Web开发领域的明星框架。它以高性能、高效率和现代化特性著称,性能媲美Go/Node.js,支持异步编程并内置自动化文档系统。本文全面解析FastAPI核心功能,包括类型安全路由、Pydantic数据验证、异步支持等,并通过实战案例展示其在RESTful API开发、微服务架构、实时数据处理及机器学习模型部署中的应用。同时,文章提供数据库集成、中间件配置和测试策略等最佳实践,解决常见问题并展望未来技术发展方向。掌握FastAPI,助你构建高效现代化Web应用。
2479 1
|
关系型数据库 MySQL 数据安全/隐私保护
Windows环境下安装及配置MySQL
本文主要讲解在Windows环境下MySQL的安装、配置
9255 1
Windows环境下安装及配置MySQL
|
关系型数据库 MySQL 索引
mysql中的索引和分区
在MySQL中,索引和分区是提高查询效率的关键技术。通过创建合适的索引,可以显著提升数据检索速度。而分区可以作为作为进一步提高查询效率的方式,在较大数据量时通常可以使用这两个结合的方式优化查询速度,所以这边将这两个进行整理,巩固个人知识,同时也希望帮助到有需要的朋友。
373 2
|
SQL 存储 算法
MySQL视图:虚拟表的创建与使用
MySQL视图是虚拟表,基于SQL查询结果生成,简化复杂查询、隐藏敏感数据,并提升安全性与可维护性。本文详解视图的创建、管理、性能优化及实战应用,助你掌握这一重要数据库工具。
|
存储 SQL 人工智能
MySQL 数据类型详解:字符串、数字、日期
在 MySQL 数据库设计中,选择合适的数据类型对存储效率和查询性能至关重要。本文详细介绍了字符串、数字和日期三大类数据类型及其子类型,帮助开发者根据业务需求做出更优选择。内容涵盖 CHAR 与 VARCHAR 的区别、TEXT 和 BLOB 的使用场景、整数与浮点类型的适用范围,以及日期时间类型的特性。通过最佳实践建议,提升数据库性能并避免常见问题。
637 4
|
消息中间件 Docker 容器
Docker中的RabbitMQ已经启动运行,但是管理界面打不开
Docker中的RabbitMQ已经启动运行,但是管理界面打不开
2387 0
|
NoSQL 安全 Redis
【Redis异常】redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password
【Redis异常】redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password
1300 0
|
API UED 开发者
鸿蒙next版开发:ArkTS组件通用属性(透明度设置)
在HarmonyOS 5.0中,ArkTS引入了透明度设置属性`opacity`,允许开发者自定义组件的透明度,从而创建复杂的视觉效果和提升用户体验。本文详细解读了`opacity`属性的用法,并提供了示例代码,展示了如何在不同透明度下展示组件。透明度设置在UI开发中具有多种用途,如创建重叠效果、增强美观性和实现动画效果。
1688 7
|
存储 SQL 关系型数据库
mysql新增表或字段时判断是否存在
mysql新增表或字段时判断是否存在
1614 0

热门文章

最新文章