Il primo codice di esempio qui è una procedura memorizzata che esegue l'intero processo in un passaggio, per quanto riguarda l'utente.
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
Note:
-
SELECT..INTO @sql crea la query necessaria e PREPARE... EXECUTE la esegue.
-
Imposta la variabile group_concat_max_len per consentire una stringa di risultati sufficientemente lunga da GROUP_CONCAT.
La procedura sopra è utile per una rapida occhiata in un ambiente amministrativo come Navicat o sulla riga di comando. Tuttavia, nonostante restituisca un set di risultati, per quanto ne so non può essere referenziato in un'altra vista o query, presumibilmente perché MySQL non è in grado di determinare, prima di eseguirlo, quali set di risultati produce, per non parlare delle colonne che hanno .
Pertanto, è comunque utile essere in grado di produrre rapidamente, senza modifiche manuali, l'istruzione SELECT...UNION separata che può essere utilizzata come vista. Ciò è utile se si desidera unire i conteggi delle righe ad altre informazioni per tabella da un'altra tabella. Di seguito un'altra stored 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
Note
-
Molto simile alla prima procedura nel concetto. Ho aggiunto un'interruzione di riga (CHAR(10)) a ciascuna istruzione sussidiaria "SELECT...UNION", per comodità nella visualizzazione o modifica della dichiarazione.
-
Puoi crearlo come una funzione e restituire SelectStatement, se è più conveniente per il tuo ambiente.
Spero di esserti stato d'aiuto.