表结构设计,不同的人设计不同,但是尽量规范,于人方便就是于已方便;本文主要介绍如何快速建表。
准备工作
创建一个用于存储表结构设计的表,名建表信息表,建表语法准备如下:
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 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中进行的,处理思路也是类似的,都是通过字符串拼接成需要的语句,同样也建议在设计过程中尽量规范,这样在以后需要设计大量表时,能更高效的处理。