03-05-2026

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.