平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“MySQL快速获取数据表字段提高开发效率的做法技巧整理”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
引言
从实现思路看,在数据库开发过程里,理解和操作数据表结构是至关重要的。MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方法来更快拿到数据表字段信息,并且有一些技巧能够帮助你显著提高开发效率。下面会系统梳理这些方法和技巧,助你在项目里更加游刃有余。
数据可视化工具:navicat15
mysql数据库版本:5.7.44
1 更快拿到数据表字段信息的方法
1.1 更快拿到列名进行查询(Select)
假设现在有一个数据表tb_ldhq_rules,结构如下所示

结合项目来看,现在我需知道这个表一共有多少个字段,你可能想到最轻松就是打开navicat一个一个数,那么有没有办法直接用sql语句来查询得到结果呢,有的
SELECT COUNT(*) AS column_count
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'jialiangkj-school' -- 数据库名
AND TABLE_NAME = 'tb_ldhq_rules'; -- 数据表名
能够看到一共有21个字段列

现在我们需查询这个表下的所有字段数据,对应的sql语句如何写?
没错大多数人可能直接想到 select *
select * from tb_ldhq_rules
显示结果正常

结合项目来看,若再进一步,我们只需查询其中的大部分字段而不是全部,比如不要del_flag,这种情况实际项目中很常用,那sql语句如何编写?
老实人的本办法,一个个复制粘贴,拼凑成一个sql查询

真正的高手都是想着办法如何偷懒,比如采用以下方法更快搞定字段列!
SELECT
GROUP_CONCAT(COLUMN_NAME SEPARATOR ', ') AS field_list
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'jialiangkj-school' -- 替换为你的数据库名称
AND TABLE_NAME = 'tb_ldhq_rules'; -- 替换为你的数据表名称
落到代码里,效果如下所示,这样是不是很便于,以后哪怕数据表再多字段直接复制粘贴一次,删除多余字段就更快搞定了

在这个场景下,借助以上方法是不是彻底告别了,一个个复制粘贴字段名的痛苦,那么思路打开,如果多表连接时需在前面加别名咋办
实际处理时,比如很常用的 from 表 a left join 表 b,一个个在列前加a.字段名,是不是很麻烦。
直接上偷懒办法
SELECT
GROUP_CONCAT(CONCAT('a.', COLUMN_NAME) SEPARATOR ', ') AS field_list
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'jialiangkj-school' -- 替换为你的数据库名称
AND TABLE_NAME = 'tb_ldhq_rules'; -- 替换为你的数据表名称
实际处理时,数据表字段多的话不要在傻傻的在前面一个个加a.xxx了,很浪费时间,还容易看花眼写错。

1.2 更快拿到列名进行更新(Update)
思路在拓展一下,现在假设我需对数据表的其中15个字段值进行更新
SELECT
GROUP_CONCAT(CONCAT(COLUMN_NAME, ' =') SEPARATOR ', ') AS field_list
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'jialiangkj-school' -- 替换为你的数据库名称
AND TABLE_NAME = 'tb_ldhq_rules'; -- 替换为你的数据表名称
执行结果

若更新的表需加入字段别名,跟错之前查询一样同理
SELECT
GROUP_CONCAT( CONCAT( 'a.', COLUMN_NAME, ' =' ) SEPARATOR ', ' ) AS field_list
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'jialiangkj-school' -- 替换为你的数据库名称
AND TABLE_NAME = 'tb_ldhq_rules';-- 替换为你的数据表名称
执行结果

2 更快拿到两个数据表的结构差异
从实现思路看,有时候同一个数据表在不同数据库中有可能出现字段不一致的情况,比如主数据库某个数据表新增或修改了字段,从数据库还没修改。或者正式环境数据库和测试环境数据库表结构字段不一致等,这时候我们需找出两者不同的字段列表出来,好做对比进行同步更新字段操作。
2.1 更快找出字段名不同的部分
实际处理时,在jialiangkj-school数据库下,有以下数据库表sys_dept

从实现思路看,在jialiangkj-school-test数据库下,有以下数据库表sys_dept

实际处理时,借助上面两个图对比可知道,jialiangkj-school.sys_dept表相比jialiangkj-school-test.sys_dept表新增了三个字段
找出jialiangkj-school.sys_dept表与jialiangkj-school-test.sys_dept表中差异的字段
-- 只在 jialiangkj-school.sys_dept 存在的字段
SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'jialiangkj-school'
AND TABLE_NAME = 'sys_dept'
AND COLUMN_NAME NOT IN (
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'jialiangkj-school-test'
AND TABLE_NAME = 'sys_dept'
)
UNION ALL
-- 只在 jialiangkj-school-test.sys_dept 存在的字段
SELECT
COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = 'jialiangkj-school-test'
AND TABLE_NAME = 'sys_dept'
AND COLUMN_NAME NOT IN (
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'jialiangkj-school'
AND TABLE_NAME = 'sys_dept'
);
显示结果

2.2 更快找出字段属性不同的部分
实际处理时,有时候我们对主数据库数据表修改了字段类型,或者不为空等属性值是,需对比从数据库的数据表查看两者之间差异,能够执行以下sql查询
SELECT
a.COLUMN_NAME AS 字段名,
a.DATA_TYPE AS 数据类型_数据库1,
b.DATA_TYPE AS 数据类型_数据库2,
a.CHARACTER_MAXIMUM_LENGTH AS 长度_数据库1,
b.CHARACTER_MAXIMUM_LENGTH AS 长度_数据库2,
a.IS_NULLABLE AS 是否可空_数据库1,
b.IS_NULLABLE AS 是否可空_数据库2,
a.COLUMN_DEFAULT AS 默认值_数据库1,
b.COLUMN_DEFAULT AS 默认值_数据库2,
a.COLUMN_COMMENT AS 注释_数据库1,
b.COLUMN_COMMENT AS 注释_数据库2
FROM
INFORMATION_SCHEMA.COLUMNS a
JOIN
INFORMATION_SCHEMA.COLUMNS b
ON
a.COLUMN_NAME = b.COLUMN_NAME
WHERE
a.TABLE_SCHEMA = 'jialiangkj-school'
AND a.TABLE_NAME = 'sys_dept'
AND b.TABLE_SCHEMA = 'jialiangkj-school-test'
AND b.TABLE_NAME = 'sys_dept'
AND (
a.DATA_TYPE != b.DATA_TYPE
OR a.CHARACTER_MAXIMUM_LENGTH != b.CHARACTER_MAXIMUM_LENGTH
OR a.IS_NULLABLE != b.IS_NULLABLE
OR a.COLUMN_DEFAULT != b.COLUMN_DEFAULT
OR a.COLUMN_COMMENT != b.COLUMN_COMMENT
);
执行以上sql后,两个表之间字段属性差异一目了然

采用技巧总结
从实现思路看,总之,在我们实际的项目开发中,采用上述方法做sql语句查询拿到列名要灵活运用,比如假设数据表字段有21个,你只需查询其中的几个字段,那么就完全没必要采用上述方法拿到数据表字段,直接手动复制粘贴需的字段更为迅速,要根据实际情况具体情况具体分析,不要陷入思维固化的误区。
在这个场景下,总的来说,MySQL拿到数据表字段适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

