Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:riepiloga tutti i conteggi delle righe della tabella in una singola query

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.