今回は、
今回はそんな便利に使えるGenerated Columnを紹介していきます。
検証環境
今回は第125回 phpMyAdminでDockerで建てたMySQLにアクセスするで紹介したdocker-composeを利用して作成します。手元で簡単に試せるように、
Generated Columnとは?
Generated Columnは、
対してSTOREDは、
使い分けとしては、
現状では、
また、
宣言方法は、
CREATE TABLE テーブル名 (カラム名 型 [GENERATED ALWAYS] AS 式 [ VIRTUAL | STORED ]) ALTER TABLE テーブル名 ADD COLUMN カラム名 型 [GENERATED ALWAYS] AS 式 [ VIRTUAL | STORED ]
GENERATED ALWAYSは無くても良いですが、
Generated Columnを使用してみる
今回は、
今回のregionカラムで定義する地方は、
地方名 | 県名 |
---|---|
北海道地方 | 北海道 |
東北地方 | 青森、 |
関東地方 | 茨城、 |
中部地方 | 山梨、 |
近畿地方 | 福井、 |
中国地方 | 鳥取、 |
四国地方 | 香川、 |
九州地方 | 大分、 |
これをすでにあるzipcodeテーブルのprefectureカラムの情報から自動で生成して、
Generated Columnを定義する
Generated Columnはテーブル定義として定義をします。そのため、
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; Query OK, 0 rows affected (0.29 sec) Records: 0 Duplicates: 0 Warnings: 0
ちょっと大きくて戸惑うかもしれませんが、
では、
mysql> select region, prefecture from zipcode group by prefecture, region; +-----------------+--------------+ | region | prefecture | +-----------------+--------------+ | 北海道地方 | 北海道 | | 東北地方 | 青森県 | | 東北地方 | 岩手県 | | 東北地方 | 宮城県 | | 東北地方 | 秋田県 | | 東北地方 | 山形県 | 〈省略〉 | 九州地方 | 長崎県 | | 九州地方 | 熊本県 | | 九州地方 | 大分県 | | 九州地方 | 宮崎県 | | 九州地方 | 鹿児島県 | | 九州地方 | 沖縄県 | +-----------------+--------------+ 47 rows in set (0.21 sec)
このように、
mysql> ALTER TABLE zipcode ADD INDEX region(region); Query OK, 0 rows affected (1.23 sec) Records: 0 Duplicates: 0 Warnings: 0
特にエラーになることもなく、
mysql> EXPLAIN SELECT region FROM zipcode WHERE region = '北海道地方'; +----+-------------+---------+------------+------+---------------+--------+---------+-------+-------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+--------+---------+-------+-------+----------+-------------+ | 1 | SIMPLE | zipcode | NULL | ref | region | region | 1023 | const | 15110 | 100.00 | Using index | +----+-------------+---------+------------+------+---------------+--------+---------+-------+-------+----------+-------------+ 1 row in set, 1 warning (0.02 sec)
上記の結果から、
また、
mysql> ALTER TABLE zipcode ADD PRIMARY KEY(region); ERROR 3106 (HY000): 'Defining a virtual generated column as primary key' is not supported for generated columns.
上記のようにエラーになってしまいました。このような使い方をしたい場合には、
まとめ
今回は、
アプリケーション側で生成するのとの違いとしては、