GUÍA COMPLETA DE GENERATED COLUMNS EN MYSQL

Las Generated Columns (columnas generadas) son una funcionalidad muy potente introducida en MySQL 5.7 que permite crear columnas cuyo valor se calcula automáticamente a partir de otras columnas de la misma tabla.

¿Qué son las Generated Columns?

Una columna generada es aquella cuyo contenido se genera a partir de una expresión. MySQL se encarga de calcular y mantener su valor automáticamente, evitando tener que hacerlo desde la aplicación.

Tipos de Generated Columns

  1. VIRTUAL: Es el predeterminado y el valor se calcula en tiempo de consulta. No ocupa espacio en disco, pero consume CPU cada vez que se lee.
  2. STORED:El valor se calcula al insertar o actualizar la fila y se guarda físicamente en el disco. Ocupa espacio pero mejora el rendimiento en lecturas.
Las Generated Columns son una de las mejores características de MySQL para mantener la integridad y el rendimiento de tus bases de datos sin sacrificar simplicidad.

Sintaxis básica

CREATE TABLE empleados (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100),
apellido VARCHAR(100),
salario_base DECIMAL(10,2),

-- Columna generada VIRTUAL
nombre_completo VARCHAR(201) GENERATED ALWAYS AS (CONCAT(nombre, ' ', apellido)) VIRTUAL,

-- Columna generada STORED
salario_neto DECIMAL(10,2) GENERATED ALWAYS AS (salario_base * 0.85) STORED
);

Ejemplos prácticos

Ejemplo 1: Nombre completo y iniciales

ALTER TABLE clientes 
ADD COLUMN nombre_completo VARCHAR(255) GENERATED ALWAYS AS (
TRIM(CONCAT(nombre, ' ', COALESCE(apellido1, ''), ' ', COALESCE(apellido2, '')))
) VIRTUAL,

ADD COLUMN iniciales CHAR(3) GENERATED ALWAYS AS (
UPPER(CONCAT(LEFT(nombre,1), LEFT(apellido1,1), LEFT(COALESCE(apellido2,''),1)))
) STORED;

Ejemplo 2: Precio con impuestos

CREATE TABLE productos (
id INT PRIMARY KEY,
precio_neto DECIMAL(10,2) NOT NULL,
iva DECIMAL(4,2) DEFAULT 0.21,
precio_bruto DECIMAL(10,2) GENERATED ALWAYS AS (precio_neto * (1 + iva)) STORED,
precio_con_descuento DECIMAL(10,2) GENERATED ALWAYS AS (precio_bruto * 0.95) VIRTUAL
);

Ejemplo 3: Campos de auditoría y búsqueda

ALTER TABLE pedidos 
ADD COLUMN search_vector TEXT GENERATED ALWAYS AS (
LOWER(CONCAT(cliente_nombre, ' ', numero_pedido, ' ', COALESCE(notas, '')))
) VIRTUAL,

ADD COLUMN total_con_iva DECIMAL(12,2) GENERATED ALWAYS AS (
total * 1.21
) STORED;

Ventajas de usar Generated Columns

  • Consistencia de datos garantizada por la base de datos.
  • Mejor rendimiento en consultas frecuentes.
  • Reduce lógica en la capa de aplicación.
  • Pueden usarse en índices (especialmente las STORED).
  • Facilita búsquedas y ordenamientos complejos.

Limitaciones

  • No se pueden insertar o actualizar manualmente (excepto en modo INSERT ... SET con valor por defecto).
  • No pueden referenciar otras columnas generadas.
  • Las columnas VIRTUAL no pueden usarse en claves primarias o índices únicos (solo STORED).
  • La expresión debe ser determinista.

Mejores prácticas

  • Usa VIRTUAL cuando el cálculo sea ligero y el espacio en disco sea crítico.
  • Usa STORED para cálculos pesados o cuando necesites indexar la columna.
  • Combina Generated Columns con índices para mejorar enormemente el rendimiento.
  • Documenta bien las columnas generadas en tu esquema.