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
- 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.
- 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.
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.