0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQLのGenerated Columnとは

0
Last updated at Posted at 2025-12-16

はじめに

MySQLでテーブル設計をしていると、次のような場面に遭遇することがあります。

  • この値は毎回アプリケーション側で計算して保存している
  • 他のカラムから必ず導出できる値を持っている
  • 検索やインデックス用に欲しいが、冗長なカラムを増やしたくない

こうした課題を解決する手段の一つがGenerated Column です。

Generated Columnを一言で表すと

他のカラムの値から自動的に計算されるカラム

を指します。
アプリケーション側で値を設定する必要はなく、
MySQLが定義された式に基づいて自動的に値を生成・管理することができます。

例:姓、名、フルネームを保存する場合

CREATE TABLE users (
  first_name VARCHAR(50),
  last_name  VARCHAR(50),
  full_name  VARCHAR(101)
    GENERATED ALWAYS AS (CONCAT(last_name, ' ', first_name)) -- Generated Column
);

この例では、first_name と last_name を登録するだけで
full_nameが自動的に計算されます
full_name に対して INSERT や UPDATE を行うことはできません

そのため、計算結果の整合性が常に保証されます。

VIRTUAL と STORED

Generated Column には VIRTUAL と STORED の2種類があります。

VIRTUAL(デフォルト)

full_name VARCHAR(101)
  GENERATED ALWAYS AS (...) VIRTUAL

特徴

  • 実体データを持たない
  • SELECT 時に値を計算する(計算コストが発生する)
  • ディスク容量を消費しない

主な用途

  • 表示専用のカラム
  • 軽量な計算結果

STORED

full_name VARCHAR(101)
  GENERATED ALWAYS AS (...) STORED

特徴

  • 計算結果を物理的に保存する
  • INSERT / UPDATE 時に計算される
  • ディスク容量を消費する
  • 読み取り性能が高い

主な用途

  • WHERE句や ORDER BY で使用する値
  • インデックスを張りたいカラム

おわりに

最後まで読んでいただきありがとうございます!
頻繁にSELECTしないデータはVIRTUALのGenerated Columnを使うのが良さそうです!
一方で計算式が複雑でコストが高かったり、INDEXを貼ったりする場合はSTOREDのGenerated Columnを使うのが良さそうです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?