Le premier exemple de code ici est une procédure stockée qui exécute l'ensemble du processus en une seule étape, en ce qui concerne l'utilisateur.
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
Remarques :
-
Le SELECT..INTO @sql crée la requête nécessaire, et le PREPARE... EXECUTE l'exécute.
-
Définit la variable group_concat_max_len afin de permettre une chaîne de résultat suffisamment longue de GROUP_CONCAT.
La procédure ci-dessus est utile pour un aperçu rapide dans un environnement d'administration comme Navicat, ou sur la ligne de commande. Cependant, malgré le retour d'un ensemble de résultats, pour autant que je sache, il ne peut pas être référencé dans une autre vue ou requête, probablement parce que MySQL est incapable de déterminer, avant de l'exécuter, quels ensembles de résultats il produit, sans parler des colonnes qu'ils ont .
Ainsi, il est toujours utile de pouvoir produire rapidement, sans modification manuelle, l'instruction SELECT...UNION séparée qui peut être utilisée comme vue. C'est utile si vous souhaitez joindre le nombre de lignes à d'autres informations par table d'une autre table. Ci-joint une autre procédure stockée :
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
Remarques
-
Très similaire à la première procédure dans le concept. J'ai ajouté un saut de ligne (CHAR(10)) à chaque instruction "SELECT...UNION" subsidiaire, pour faciliter l'affichage ou la modification de l'instruction.
-
Vous pouvez le créer en tant que fonction et renvoyer SelectStatement, si cela convient mieux à votre environnement.
J'espère que ça aide.