Amazon Aurora の MySQL 5.7 互換で生成カラム(generated column)を試してみた

Amazon Aurora

先日の記事で Amazon AuroraMySQL 5.7 互換で全文検索を試してみたので、今回は MySQL 5.7 からの新機能である生成カラム(generated column)を試してみたいと思います。

enomotodev.hatenablog.com

生成カラム(generated column)とは

生成カラム(generated column)は MySQL 5.7.6 から追加された機能です。

これまで、関数で計算した結果をトリガーで特定のカラムに入れていたのを、簡単に定義することができるもので、カラム定義時に AS 計算式 と書くことにより、そのカラムの値が該当の計算結果になります。

それでは実際にやってみましょう!

環境

  • Aurora 2.01
  • Aurora MySQL 5.7.12

生成カラム(generated column)の使い方

まずは first_name, last_name カラムを持った users テーブルを作り、そこに first_name, last_name を文字列結合した full_name を生成カラムとして作ってみます。

mysql> CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    first_name VARCHAR(255),
    last_name VARCHAR(255),
    full_name VARCHAR(255) AS (CONCAT(first_name, " ", last_name))
) ENGINE=InnoDB CHARACTER SET utf8mb4;
Query OK, 0 rows affected (0.05 sec)

これで full_name カラムに CONCAT(first_name, " ", last_name) の結果が自動的に入るようになりました。

実際にデータをインサートして確かめてみます。

mysql> INSERT INTO users (first_name, last_name) VALUES
("Rigel", "Cherry"),
("Leandra", "Mcneil"),
("Armando", "Bond"),
("Ebony", "Sharp"),
("Iona", "Reed"),
("Nomlanga", "Carrillo"),
("Hector", "Fisher"),
("Emery", "Gross"),
("Ginger", "Cox"),
("Gage", "Finch");
Query OK, 10 rows affected (0.02 sec)
Records: 10  Duplicates: 0  Warnings: 0

データを10件インサートしたので select してデータを見ます。

mysql> SELECT * FROM users;
+----+------------+-----------+-------------------+
| id | first_name | last_name | full_name         |
+----+------------+-----------+-------------------+
|  1 | Rigel      | Cherry    | Rigel Cherry      |
|  2 | Leandra    | Mcneil    | Leandra Mcneil    |
|  3 | Armando    | Bond      | Armando Bond      |
|  4 | Ebony      | Sharp     | Ebony Sharp       |
|  5 | Iona       | Reed      | Iona Reed         |
|  6 | Nomlanga   | Carrillo  | Nomlanga Carrillo |
|  7 | Hector     | Fisher    | Hector Fisher     |
|  8 | Emery      | Gross     | Emery Gross       |
|  9 | Ginger     | Cox       | Ginger Cox        |
| 10 | Gage       | Finch     | Gage Finch        |
+----+------------+-----------+-------------------+
10 rows in set (0.02 sec)

full_name カラムに問題なくデータが入っていました!

生成カラムでの検索も

mysql> SELECT * FROM users WHERE full_name LIKE "%il%";
+----+------------+-----------+-------------------+
| id | first_name | last_name | full_name         |
+----+------------+-----------+-------------------+
|  2 | Leandra    | Mcneil    | Leandra Mcneil    |
|  6 | Nomlanga   | Carrillo  | Nomlanga Carrillo |
+----+------------+-----------+-------------------+
2 rows in set (0.00 sec)

普通のカラムを扱うのと同じように検索できます。

まとめ

生成カラム(generated column)を簡単にですが、実際に作って試してみました。

色々と使い道がありそうですが、同じく MySQL 5.7 からの新機能である JSON 型と組み合わせることによっても、すごく真価を発揮するようなので、今度は JSON 型と一緒に勉強してみたいと思います。