在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;
答案 0 :(得分:1)
请记住:
当您在非唯一值上连接两个表时,最终会得到包含匹配字段的行的所有可能组合。
table_name
和table_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;