Generated Column は、MySQL 5.7.6 から導入された機能。

Generated Columnは、定義した式に従って値を生成してカラムのように扱える仕組みです。Generate Columnには種類が2種類あり、VIRTUALとSTOREDになります。何も指定を行わなかった場合はVIRTUALがデフォルトで適用されます。VIRTUALは計算結果を保存せずにSELECTするたびに再計算される仕組みで、文字通り仮想的なカラムとして操作することができます。

対してSTOREDは、挿入と更新を行った際に事前に計算した結果をカラムに保存する仕組みになります。こちらは物理的に結果が保存されているので、通常のカラムと同様に扱うことができます。

ref. 第150回 Generated Columnを利用してみる | gihyo.jp

VIRTUAL は制約あるものの基本的にはセカンダリインデックスにも利用可能なので、こちらで良さそう。

VIRTUALで宣言された場合でも、5.7.8からセカンダリインデックスが張れるようになりました。

定義SQL

mysql> ALTER TABLE zipcode ADD COLUMN region VARCHAR(255) GENERATED ALWAYS AS (CASE
    WHEN prefecture = '北海道' THEN '北海道地方'
    WHEN prefecture IN ('青森県', '秋田県', '岩手県', '山形県', '宮城県', '福島県') THEN '東北地方'
    WHEN prefecture IN ('茨城県', '栃木県', '群馬県', '埼玉県', '東京都', '千葉県', '神奈川県') THEN '関東地方'
    WHEN prefecture IN ('山梨県', '新潟県', '長野県', '静岡県', '岐阜県', '愛知県', '富山県', '石川県') THEN '中部地方'
    WHEN prefecture IN ('福井県','滋賀県', '京都府', '三重県', '奈良県', '大阪府', '和歌山県', '兵庫県') THEN '近畿地方'
    WHEN prefecture IN ('鳥取県', '岡山県', '島根県', '広島県', '山口県') THEN '中国地方'
    WHEN prefecture IN ('香川県', '徳島県', '愛媛県', '高知県') THEN '四国地方'
    WHEN prefecture IN ('大分県', '宮崎県', '福岡県', '鹿児島県', '熊本県', '佐賀県', '長崎県', '沖縄県') THEN '九州地方'
    END) VIRTUAL;