MySQL 全テーブルの行数を出力する方法

INFORMATION_SCHEMA.TABLES に table_rows というものがあるのですが
InnoDB だと件数が正しくありません。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 21.2 INFORMATION_SCHEMA TABLES テーブル

TABLE_ROWS カラムはテーブルが INFORMATION_SCHEMA のデータベースにある場合は NULL です。
InnoDB テーブルは、行カウントは SQL の最適化で使用される単なる大雑把な予測です。

踏み込んで調べてませんが、どういうことなんでしょうか。
不便ですよね。

ということで

ストプロで書いてみました。

 
 

実行例

call all_tables_count('test');

+------------+----------+
| department | COUNT(*) |
+------------+----------+
| department |        4 |
+------------+----------+
1 row in set (0.00 sec)

+----------+----------+
| employee | COUNT(*) |
+----------+----------+
| employee |       11 |
+----------+----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

 
shellで -N つけて実行する方がいいかもしれません。

$ echo "call all_tables_count('test');" | mysql -u root test -N
department  4
employee    11

 
 

ちょっと解説

delimiter

区切り文字をセミコロン(;)から// に変更しています。
理由は、ストプロ内のセミコロン(;)をSQLの終端として認識させないためです。

concat

SET @s = CONCAT('SELECT \'', _tableName, '\', COUNT(*) FROM ', _tableName);

なんとMySQLのストプロでは、テーブル名を動的に変更するようなSQLは書けないようで 一旦文字列にしてSQLを組み立ててから実行しています。
不便ですね。
(ストプロ使わずにスクリプト言語で書いた方が多分早かったです。)
 
 

See Also

mysqlのストアドプロシージャの便利さをアピールしてみる - (゚∀゚)o彡 sasata299's blog
MySQL のストアドプロシージャで動的なテーブル名を指定する - Memo