从MySQL中的Information_schema收集表键

时间:2014-02-04 02:41:16

标签: mysql information-schema

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

这是我写的一个查询。不幸的是,大多数情况下pk_length(主键中的列数)不正确,有时表上的键数也是错误的。

  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;

我做错了什么导致这2个字段的数据不正确?

编辑:这是使用子查询的固定查询。

  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;

2 个答案:

答案 0 :(得分:1)

请记住:

  • 当您在非唯一值上连接两个表时,最终会得到包含匹配字段的行的所有可能组合。

  • table_nametable_schema不是key_column_usage中的唯一值。

因此,在给定表的key_column_usage中有多行的情况下,您最终会得到statistics中相应行的多个副本。这会弄乱你的pk_length

您很可能需要将其拆分为两个单独的查询:一个用于pk_length,另一个用于key_count

答案 1 :(得分:-1)

更新

SELECT
    t.table_schema,
    t.table_name,
    t.table_rows,
    SUM(s.index_name = 'PRIMARY') AS pk_length,
    COUNT(DISTINCT s.index_name) 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
    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;