查找数据库中的所有字段的信息
到此,我们只剩下一个索引没有解决
以上数据我们都找到了,接下来就是写SQL让他们合并在一起
selectic.table_schema '数据库名',ic.table_name '表名',ic.column_name '列名',ic.data_type '字段类型',
case ic.column_keywhen 'PRI' then'是'else '否'
end '是否主键',
IF(ist.column_name = ic.column_name,'是','否') '是否索引',ic.column_comment
from information_schema.columns ic -- 字段表
left joininformation_schema.statistics ist -- 索引
on (ic.table_schema = ist.table_schema
andic.table_name = ist.table_name)
解决方案
MySQL相对来说简单的原因是他是可视化操作,而我们需要输入命令来查找系统表
select * from user_tab_columns --这条语句可以找出类似于MySQL中columns的表
这里有一个注意点(中的user)
这样我们可以获得表名、字段名、数据类型(这边没有获取数据库名是因为我们实际过程中当前用户只能访问一个数据库并且我们平时用的也是该数据库,所以数据库名另外加上即可)
select * from user_cons_columns
这一块代表的是约束信息,这里1234显示的应该是顺序,而我观察了我这边的数据库可以得到‘1’是主键
接下来我们需要查找索引,使用以下语句
select * from user_IND_COLUMNS
可以通过外连接将其显示
到此为止我们只剩下一个备注还没有搞定,通过下面这条语句可以找到字段对应的备注信息
select * from user_col_comments
至此我们已经找到了所有需要的数据,接下来只需执行sql语句拼接即可
selectdtc.table_name table_name,dtc.column_name column_name,dtc.data_type column_type,
CASE ucc.positionWHEN 1 THEN'是'ELSE'否'
END iskey,
CASE WHEN uic.COLUMN_POSITION is null THEN'否'ELSE'是'
END isindex,utc.COMMENTSfrom(select * from user_tab_columns) dtc
LEFT JOIN(select *from user_cons_columns colWHERE col.POSITION = 1) ucc
on (dtc.table_name = ucc.table_name and dtc.column_name = ucc.column_name)
LEFT JOIN (select * from user_IND_COLUMNS) uic
on (dtc.table_name = uic.table_name and dtc.column_name = uic.column_name)
LEFT JOIN(select * from user_col_comments) utc
on(dtc.table_name = utc.table_name and dtc.column_name = utc.column_name)
ORDER BYdtc.table_name
SQL 解决方案
说来惭愧,小黄至今都还未解决SQL 中索引和备注的信息,主要原因是查找到了索引但不知道如何将两张表连接在一起。在这里小黄也希望各位大佬来帮我诊断一下以上是否有错误,以及帮我补充一下SQL 的解决方案。
select * from INFORMATION_SCHEMA.COLUMNS --这条语句作为我们的主表,其他的表进行外连接
查找字段是否为主键
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
SQL 我的部分解决方案
select tsc.table_catalog,tsc.table_name,tsc.column_name,tsc.data_type,
CASE WHEN iskc.ordinal_position is null THEN '否'ELSE '是'
END iskey
from INFORMATION_SCHEMA.COLUMNS tscleft join(select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE) iskc
on (tsc.column_name = iskc.column_name and tsc.table_name = iskc.table_name)order by table_name
2021.8.9更新
小黄来更新啦!至今还没有解决SQL 索引的问题,但又遇到一个新的问题,简直就是一波未平一波又起!!!
情况大致就是上面这么个情况,多了一个系统使用的是pgsql的数据管理系统,这可把小黄整懵了,上述三个数据系统大多都是有所耳闻,这个是我见识短浅,听都没听过。还是面向百度解决问题,让我们看看小黄是如何解决的
pgsql解决方案
小黄经过一早上的努力还是完全解决,没办法将索引表和字段表关联,希望大佬能帮我解决以下
总结一下经验,我们主表一般都选择用字段来呈现,所以我们考虑查询一下字段信息
SELECT * FROM pg_attribute
调用以上方法可以得到数据库中所有的字段
那我们可以重新理一下sql语句
SELECT * FROM pg_attribute where attnum > 0
接下来我们先将表ID进行关联,以下是查找表的代码
这里要着重讲一下系统字段,在字段表和表名表进行关联的时候
关联条件是 字段表. = 表名表.oid
而oid是需要显示定义的,直接查询时无法显示系统字段的
SELECT C.oid,*
FROMpg_class C
WHERErelkind = 'r' AND relname NOT LIKE'pg_%' AND relname NOT LIKE'sql_%'
这里需要注意的时字段,我们可以来看一下官方文档官方文档
我们需要的是普通表,所以将值为r的筛选出来
而表名中pg开头的值和sql开头的值对应的都是系统表,我们也不需要
接下来我们需要解决的是字段类型
SELECT t.oid,* FROM pg_type t
再者就是解决字段备注的语句,调用以下方法
SELECT * FROM pg_description d
pgsql的部分解决方案
SELECT C.relname 表名,cast(obj_description(relfilenode,'pg_class') as varchar) AS "表名描述",A.attname 字段名,t.typname as "字段类型",d.description AS "字段备注",(casewhen (selectcount(pg_constraint.*)frompg_constraintinner join pg_class onpg_constraint.conrelid = pg_class.oidinner join pg_attribute onpg_attribute.attrelid = pg_class.oidand pg_attribute.attnum = any(pg_constraint.conkey)inner join pg_type onpg_type.oid = pg_attribute.atttypidwherepg_class.relname = c.relnameand pg_constraint.contype = 'p'and pg_attribute.attname = a.attname) > 0 then trueelse false end) as 是否主键
FROMpg_attribute A
LEFT JOIN ( SELECT c.oid,* FROM pg_class C WHERE relkind = 'r' AND relname NOT LIKE'pg_%' AND relname NOT LIKE'sql_%' ) C
ON A.attrelid = C.oid
left join (SELECT t.oid,* FROM pg_type t) T
ona.atttypid = t.oid
left join (SELECT * FROM pg_description d) D
on d.objoid=a.attrelid and d.objsubid=a.attnum
WHEREc.relname is not null
anda.attnum > 0
order by C.relname