Prvním příkladem kódu je zde uložená procedura, která provede celý proces v jednom kroku, pokud jde o uživatele.
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
Poznámky:
-
SELECT..INTO @sql vytvoří potřebný dotaz a PREPARE... EXECUTE jej spustí.
-
Nastaví proměnnou group_concat_max_len, aby umožnil dostatečně dlouhý řetězec výsledků z GROUP_CONCAT.
Výše uvedený postup je užitečný pro rychlý pohled v prostředí správce, jako je Navicat, nebo na příkazovém řádku. Navzdory tomu, že vrací sadu výsledků, pokud je mi známo, nelze na ni odkazovat v jiném pohledu nebo dotazu, pravděpodobně proto, že MySQL není schopno před spuštěním určit, jaké sady výsledků vytváří, natož jaké sloupce mají .
Stále je tedy užitečné mít možnost rychle vytvořit, bez ručních úprav, samostatný příkaz SELECT...UNION, který lze použít jako pohled. To je užitečné, pokud chcete připojit počty řádků k jiným informacím o tabulce z jiné tabulky. Zde další uložená procedura:
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
Poznámky
-
Velmi podobný prvnímu postupu v konceptu. Přidal jsem zalomení řádku (CHAR(10)) do každého příkazu „SELECT...UNION“ dceřiné společnosti pro usnadnění prohlížení nebo úpravy příkazu.
-
Můžete to vytvořit jako funkci a vrátit SelectStatement, pokud je to pro vaše prostředí výhodnější.
Doufám, že to pomůže.