0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQLで「使っていないカラム」を一発で調べる方法

Posted at

「このテーブルのカラム、実際には使われていないのでは?」
大規模なテーブルを運用していると、そんな疑問が出てきます。

そこで今回は MySQLで未使用カラムを一括チェックするSQL を紹介します。

仕組み
INFORMATION_SCHEMA.COLUMNS から対象テーブルのカラム一覧を取得
GROUP_CONCAT で動的に SUM(CASE ...) を生成
各カラムごとに「NULLでも空文字でもない値の件数」をカウント
全て 0 なら「使っていないカラム」と判定できる

-- 1セッション内の group_concat の制限を拡大
SET SESSION group_concat_max_len = 1000000;

-- 動的SQLを生成
SET @sql = (
SELECT CONCAT(
'SELECT ',
GROUP_CONCAT(
'SUM(CASE WHEN ', COLUMN_NAME, ' IS NOT NULL AND ', COLUMN_NAME, ' <> '''' THEN 1 ELSE 0 END) AS ', COLUMN_NAME, ''
SEPARATOR ', '
),
' FROM your_database.your_table'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database'
AND TABLE_NAME = 'your_table'
);

-- 実行
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

実行例
例えば、your_database.your_table テーブルで実行すると、下記のような結果が得られます:

COL1 COL2 COL3 ...
123 0 56 ...

ここで 0 になっているカラムが 未使用カラム です。

ポイント
SET SESSION group_concat_max_len = 1000000; を入れないと、カラム数が多い場合にSQLが途中で切れてしまうことがあります。
データベース名とテーブル名は必ず自分の環境に合わせて修正してください。
実際には「一度も値が入っていない」ことを確認するだけなので、業務的に本当に不要かは別途判断してください。

まとめ
この方法を使えば、数百カラムあるテーブルでも一発で「使っていないカラム」を洗い出せます。
スキーマ整理やリファクタリング時の調査にぜひ活用してください! 🚀

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?