De eerste voorbeeldcode hier is een opgeslagen procedure die het hele proces in één stap uitvoert, voor zover het de gebruiker betreft.
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
Opmerkingen:
-
De SELECT..INTO @sql maakt de benodigde query en de PREPARE... EXECUTE voert deze uit.
-
Stelt de variabele group_concat_max_len in om een voldoende lange resultaatreeks van GROUP_CONCAT toe te staan.
De bovenstaande procedure is handig voor een snelle blik in een beheerdersomgeving zoals Navicat, of op de opdrachtregel. Ondanks het retourneren van een resultatenset, kan er voor zover ik weet niet naar worden verwezen in een andere weergave of query, vermoedelijk omdat MySQL niet in staat is om, voordat het wordt uitgevoerd, te bepalen welke resultatensets het produceert, laat staan welke kolommen ze hebben .
Het is dus nog steeds handig om snel, zonder handmatige bewerking, het afzonderlijke SELECT...UNION-statement te kunnen maken dat als View kan worden gebruikt. Dat is handig als u de rijtellingen wilt samenvoegen met andere informatie per tafel uit een andere tabel. Hierbij nog een opgeslagen 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
Opmerkingen
-
Zeer vergelijkbaar met de eerste procedure in concept. Ik heb een regeleinde (CHAR(10)) toegevoegd aan elke dochteronderneming "SELECT...UNION"-instructie, voor het gemak bij het bekijken of bewerken van de instructie.
-
U kunt dit als een functie maken en de SelectStatement retourneren, als dat handiger is voor uw omgeving.
Ik hoop dat dat helpt.