sql >> Database >  >> RDS >> Mysql

MySQL:vat alle rijtellingen van tabellen samen in één enkele query

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.




  1. UID – Retourneer de ID van de huidige sessie in Oracle

  2. SET NULL:geef een tekenreeks op die moet worden geretourneerd wanneer een null-waarde voorkomt in SQLcl / SQL*Plus

  3. gem install pg kan niet binden aan libpq

  4. Tabel- en kolomnamen ontleden uit SQL/HQL Java