MySQL中从信息模式收集表键

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

在MySQL中,我试图使用信息模式来收集关于我的表的数据。我的目标是在一个查询中选择数据,并将其直接插入到另一个表中,以便将来进行分析和处理

这是我写的一个问题。不幸的是,大多数时候pk_长度(主键中的列数)是不正确的,有时表上的键数也是错误的

  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;