MySQL中从信息模式收集表键
在MySQL中,我试图使用信息模式来收集关于我的表的数据。我的目标是在一个查询中选择数据,并将其直接插入到另一个表中,以便将来进行分析和处理 这是我写的一个问题。不幸的是,大多数时候pk_长度(主键中的列数)是不正确的,有时表上的键数也是错误的MySQL中从信息模式收集表键,mysql,information-schema,Mysql,Information Schema,在MySQL中,我试图使用信息模式来收集关于我的表的数据。我的目标是在一个查询中选择数据,并将其直接插入到另一个表中,以便将来进行分析和处理 这是我写的一个问题。不幸的是,大多数时候pk_长度(主键中的列数)是不正确的,有时表上的键数也是错误的 SELECT t.table_schema, t.table_name, SUM(k.constraint_name="PRIMARY") as pk_length, count(distinct s.index_na
SELECT
t.table_schema,
t.table_name,
SUM(k.constraint_name="PRIMARY") as pk_length,
count(distinct s.index_name) as key_count,
t.table_rows
FROM tables t, statistics s, key_column_usage k
WHERE t.table_name = s.table_name
AND t.table_schema = s.table_schema
AND t.table_name = k.table_name
AND t.table_schema = k.table_schema
GROUP BY t.table_schema, t.table_name;
我做错了什么导致这两个字段的数据不正确
编辑:这是使用子查询的固定查询
SELECT
t.table_schema,
t.table_name,
k.pk_length,
count(distinct s.index_name) as key_count,
t.table_rows
FROM tables t,
statistics s,
(SELECT table_schema, table_name, count(*) as "pk_length"
FROM key_column_usage group by table_schema, table_name) as k
WHERE t.table_name = s.table_name
AND t.table_schema = s.table_schema
AND t.table_name = k.table_name
AND t.table_schema = k.table_schema
GROUP BY t.table_schema, t.table_name
LIMIT 20;
记住:
- 当您在一个非唯一值上联接两个表时,您将得到包含匹配字段的行的所有可能组合
和table\u name
在table\u schema
key\u column\u用法中不是唯一的值
键列使用情况中有多行的情况下,您将得到统计数据中相应行的多个副本。这会弄乱你的pk\u长度
您很可能需要将其分为两个单独的查询:一个查询pk\u长度
,另一个查询key\u计数
第一种方法(错误答案)
这个怎么样
SELECT
t.table_schema,
t.table_name,
t.table_rows,
SUM(s.index_name = 'PRIMARY') AS pk_length,
SUM(s.index_name != 'PRIMARY') AS key_count
FROM
tables t, statistics s
WHERE
t.table_name = s.table_name
AND t.table_schema = s.table_schema
GROUP BY
t.table_schema, t.table_name;
我想拆分它,但作为一个插入SELECT FROM的命令,我需要将所有SELECT命令都放在一个查询中。我可以做多个插入,然后聚合它们。在这种情况下,使用子查询怎么样?子查询非常完美。我已将结果查询放入问题中。pk_长度来自不同的表。此外,此查询将提供非主索引中的列数,而不是非主索引的数量。@Jericon Ok。我已经更新了我的答案。我误解了键数
。但是,pku长度
令人困惑。我认为,pk\u length
可以计算,因为我只尝试了两个表连接。@Jericon我已经阅读了您使用子查询修改的查询。更新后的查询返回的结果与您的查询相同,并且使用两个表,速度比您的查询快。我不明白为什么我的答案会被否决。@Jericon和。。。我认为您的子查询不会返回没有PK的表。请考虑<代码>左联接(子查询)K< /代码> @ Jericon另一个问题。代码>键列\用法
不仅包含PK,还包含FK。我想知道你是否真的想把FK算作PK。
SELECT
t.table_schema,
t.table_name,
t.table_rows,
SUM(s.index_name = 'PRIMARY') AS pk_length,
SUM(s.index_name != 'PRIMARY') AS key_count
FROM
tables t, statistics s
WHERE
t.table_name = s.table_name
AND t.table_schema = s.table_schema
GROUP BY
t.table_schema, t.table_name;