MySQLのGENERATED COLUMN(生成カラム)とは?テーブル作成時の使い方を実例付きで解説
生成カラム(GENERATED COLUMN)とは、CREATE TABLE文やALTER TABLE文で使用できるMySQLの機能の一つで、INSERTやUPDATE句で値を明示的に送信することなく、テーブル内にデータを保存できる仕組みです。この機能はMySQL 5.7から導入されました。
生成カラムはテーブルのドメイン内で動作し、同じテーブル内の他のカラムの値をもとに自動的に計算されます。基本の構文は以下の通りです。
構文
column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]
まず最初に、カラム名とそのデータ型を指定します。その後、以下の手順に従って定義を進めます。
- GENERATED ALWAYS句を追加して、そのカラムが生成カラムであることを示します。
- 次に、VIRTUALまたはSTOREDのいずれかのオプションで生成カラムの種類を指定します。明示的に指定しない場合、MySQLはデフォルトでVIRTUALを採用します。
式(expression)のルール
ASキーワードの後ろの括弧内には式を指定します。式には以下の要素を含めることができます。
- リテラル(固定値)
- パラメータを持たない組み込み関数
- 演算子
- 同一テーブル内の任意のカラムへの参照
なお、式に関数を使用する場合は、その関数がスカラー型であり、かつ決定的(deterministic:同じ入力に対して常に同じ結果を返す)である必要があります。
さらに、生成カラムがSTOREDタイプの場合は、一意制約(UNIQUE)を定義することも可能です。
使用例
ここでは、従業員情報を格納するemployee_dataテーブルを作成し、氏名を自動的に結合する生成カラムを定義してみましょう。
mysql> Create table employee_data(ID INT AUTO_INCREMENT PRIMARY KEY, First_name VARCHAR(50) NOT NULL, Last_name VARCHAR(50) NOT NULL, FULL_NAME VARCHAR(90) GENERATED ALWAYS AS(CONCAT(First_name,' ',Last_name))); Query OK, 0 rows affected (0.55 sec) mysql> DESCRIBE employee_data; +------------+-------------+------+-----+---------+-------------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | First_name | varchar(50) | NO | | NULL | | | Last_name | varchar(50) | NO | | NULL | | | FULL_NAME | varchar(90) | YES | | NULL | VIRTUAL GENERATED | +------------+-------------+------+-----+---------+-------------------+ 4 rows in set (0.00 sec)
DESCRIBEコマンドの結果を見ると、FULL_NAMEカラムのExtra欄に「VIRTUAL GENERATED」と表示されており、このカラムが仮想生成カラムとして登録されていることが確認できます。
続いて、姓と名だけを挿入してみます。FULL_NAMEには何も値を渡していません。
mysql> INSERT INTO employee_data(first_name, Last_name) values('Yashpal','Sharma');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, Last_name) values('Krishan','Kumar');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, Last_name) values('Rakesh','Arora');
Query OK, 1 row affected (0.08 sec)テーブルの内容を確認すると、挿入していないはずのFULL_NAMEカラムに、姓名が自動的に結合された値が格納されていることがわかります。
mysql> Select * from employee_data; +----+------------+-----------+----------------+ | ID | First_name | Last_name | FULL_NAME | +----+------------+-----------+----------------+ | 1 | Yashpal | Sharma | Yashpal Sharma | | 2 | Krishan | Kumar | Krishan Kumar | | 3 | Rakesh | Arora | Rakesh Arora | +----+------------+-----------+----------------+ 3 rows in set (0.00 sec)
このように、生成カラムを活用すれば、アプリケーション側で計算や結合処理を行うことなく、データベース側で自動的に派生データを管理できます。データの一貫性を保ちつつ、重複したINSERT処理のコードを削減できるのが大きなメリットです。
-
作成済みのMySQLテーブルに新しい列を追加して値を自動入力する方法
はじめにすでに作成済みのMySQLテーブルに対して、新しい列を追加し、既存のデータをもとに値を自動的に入力する方法を解説します。本記事では「生成列(Generated Column)」を活用した実践的な手法を、具体的なSQLクエリとともに紹介します。サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable-> (-> Value1 int,-> Value2 int-> );Query OK, 0 rows affected (0.77 sec)次に、insertコマンドを使用してテーブルにいくつかのレコード
-
MySQLで予約語「Key」をカラム名として使用する方法【バッククォートの使い方】
MySQLでは「Key」は予約語(予約済みキーワード)として登録されているため、そのままカラム名として使用するとエラーが発生します。そこで活躍するのがバッククォート(`)です。カラム名の前後をバッククォートで囲むことで、予約語でも安全に使用できるようになります。本記事では、実際にカラム名「key」を持つテーブルを作成する例を通じて、具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、バッククォートで囲んだ「Key」というカラムを持つテーブルを作成しましょう。mysql> create table DemoTable ( `Key` int ); Query OK,