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