Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

MySQLでデータベース内のGenerated Columnをリストアップする

MySQL 5.7.6 以降ではGenerated Columnが使えます。 テーブル定義に計算式を記述すると計算結果をカラムとして扱えるようになる機能です。

駅メモ!でも最近利用しているGenerated Columnですが、データベース内で増えたGenerated Columnをリストアップしたくなったので方法を調べました。

GENERATION_EXPRESSIONに値があるカラムリストを得る

MySQL 5.7のリファレンスから例を流用します

CREATE TABLE triangle (
  sidea DOUBLE,
  sideb DOUBLE,
  sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

information_schema.columnsのGENERATION_EXPRESSIONにGenerated Columnかどうかの情報が格納されています MySQL :: MySQL 5.7 Reference Manual :: 24.3.5 The INFORMATION_SCHEMA COLUMNS Table

For generated columns, displays the expression used to compute column values. Empty for nongenerated columns.

Generated Columnなら値があります

SELECT
  table_name,
  column_name,
  generation_expression,
  extra
FROM
  information_schema.columns
WHERE
  table_schema = 'test'  -- データベース名
  AND generation_expression != ''
mysql> SELECT   table_name,   column_name,   generation_expression,   extra FROM   information_schema.columns WHERE   table_schema = 'test'     AND generation_expression != '';
+------------+-------------+---------------------------------------------------+-------------------+
| table_name | column_name | generation_expression                             | extra             |
+------------+-------------+---------------------------------------------------+-------------------+
| triangle   | sidec       | sqrt(((`sidea` * `sidea`) + (`sideb` * `sideb`))) | VIRTUAL GENERATED |
+------------+-------------+---------------------------------------------------+-------------------+
1 row in set (0.00 sec)

Generated Columnであるtriangle.sidecのみの結果が得られました!

extraにもGenerated Columnの場合はSTORED GENERATEDまたはVIRTUAL GENERATED が入りますが、他の値も入りうるのでやはりGENERATION_EXPRESSIONを見るのが簡単でしょう