Det første eksempelkode her er en lagret procedure, som udfører hele processen i ét trin, hvad brugeren angår.
BEGIN
# zgwp_tables_rowcounts
# TableName RowCount
# Outputs a result set listing all tables and their row counts
# for the current database
SET SESSION group_concat_max_len = 1000000;
SET @sql = NULL;
SET @dbname = DATABASE();
SELECT
GROUP_CONCAT(
CONCAT (
'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ',
table_name, ' '
)
SEPARATOR 'UNION '
) AS Qry
FROM
information_schema.`TABLES` AS t
WHERE
t.TABLE_SCHEMA = @dbname AND
t.TABLE_TYPE = "BASE TABLE"
ORDER BY
t.TABLE_NAME ASC
INTO @sql
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
Bemærkninger:
-
SELECT..INTO @sql opretter den nødvendige forespørgsel, og PREPARE... EXECUTE kører den.
-
Indstiller variablen group_concat_max_len for at tillade en lang nok resultatstreng fra GROUP_CONCAT.
Ovenstående procedure er nyttig til et hurtigt kig i et administratormiljø som Navicat eller på kommandolinjen. Men på trods af at et resultatsæt returneres, kan det så vidt jeg ved ikke refereres til i en anden visning eller forespørgsel, formodentlig fordi MySQL ikke er i stand til at bestemme, før det køres, hvilke resultatsæt det producerer, endsige hvilke kolonner de har .
Så det er stadig nyttigt hurtigt at kunne producere, uden manuel redigering, den separate SELECT...UNION-sætning, der kan bruges som en View. Det er nyttigt, hvis du ønsker at slutte rækken til andre oplysninger pr. tabel fra en anden tabel. Hermed en anden lagret procedure:
BEGIN
# zgwp_tables_rowcounts_view_statement
# Output: SelectStatement
# Outputs a single row and column, containing a (possibly lengthy)
# SELECT...UNION statement that, if used as a View, will output
# TableName RowCount for all tables in the current database.
SET SESSION group_concat_max_len = 1000000;
SET @dbname = DATABASE();
SELECT
GROUP_CONCAT(
CONCAT (
'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ',
table_name, ' ', CHAR(10))
SEPARATOR 'UNION '
) AS SelectStatement
FROM
information_schema.`TABLES` AS t
WHERE
t.TABLE_SCHEMA = @dbname AND
t.TABLE_TYPE = "BASE TABLE"
ORDER BY
t.TABLE_NAME ASC
;
END
Noter
-
Meget lig den første procedure i konceptet. Jeg tilføjede et linjeskift (CHAR(10)) til hver datterselskabs "SELECT...UNION"-erklæring for at gøre det nemmere at se eller redigere erklæringen.
-
Du kan oprette dette som en funktion og returnere SelectStatement, hvis det er mere bekvemt for dit miljø.
Håber det hjælper.