No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de SQL y MySQL

Curso de SQL y MySQL

Genaro Bernardino

Genaro Bernardino

Columnas Generadas en SQL

4/19
Recursos

La capacidad de generar columnas calculadas en MySQL representa una poderosa herramienta para optimizar el manejo de datos y automatizar operaciones. Las columnas generadas permiten realizar cálculos directamente en la base de datos, evitando la necesidad de procesar esta información en la capa de aplicación y proporcionando una forma elegante de mantener la consistencia de los datos derivados.

¿Qué son las columnas generadas en MySQL?

Las columnas generadas (generated columns) son campos cuyo valor se calcula automáticamente a partir de una expresión definida, utilizando otros campos de la misma tabla. Estas columnas funcionan de manera similar a las fórmulas en hojas de cálculo, donde el valor se determina mediante una operación matemática o manipulación de texto.

En MySQL, existen dos tipos principales de columnas generadas:

  • Virtual: La expresión se evalúa cada vez que se consulta la columna. No ocupa espacio adicional en disco, solo almacena la fórmula.
  • Stored: La expresión se evalúa cuando se inserta o actualiza la fila, y el resultado se almacena físicamente en la tabla, ocupando espacio en disco.

¿Cómo crear columnas generadas?

Para crear una columna generada, podemos utilizar la siguiente sintaxis básica:

CREATE TABLE example (
    example_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    quantity INT NOT NULL,
    price FLOAT NOT NULL,
    total FLOAT AS (quantity * price)
);

En este ejemplo, la columna total se calcula automáticamente multiplicando quantity por price. Por defecto, MySQL crea columnas generadas virtuales, pero podemos especificar que sean almacenadas añadiendo la palabra clave STORED:

CREATE TABLE example (
    example_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    quantity INT NOT NULL,
    price FLOAT NOT NULL,
    total FLOAT AS (quantity * price) STORED
);

También podemos añadir columnas generadas a tablas existentes:

ALTER TABLE products 
ADD COLUMN description_length INT 
AS (LENGTH(description)) VIRTUAL;

¿Cuándo utilizar columnas virtuales vs. almacenadas?

La elección entre columnas generadas virtuales o almacenadas depende de varios factores:

Columnas virtuales

Ventajas:

  • No ocupan espacio adicional en disco
  • Ideales para operaciones de solo lectura
  • Siempre reflejan el valor actual basado en los datos de origen

Desventajas:

  • Se calculan en cada consulta, lo que puede afectar el rendimiento en consultas frecuentes

Columnas almacenadas

Ventajas:

  • Mejor rendimiento en consultas frecuentes
  • Permiten crear índices sobre ellas

Desventajas:

  • Ocupan espacio adicional en disco
  • Pueden generar sobrecarga durante las operaciones de inserción y actualización

La decisión debe basarse en el patrón de uso de la tabla: si predominan las operaciones de lectura, las columnas almacenadas pueden ser más eficientes; si predominan las escrituras, las columnas virtuales podrían ser preferibles.

Casos de uso prácticos

Cálculo de totales en tiempo real

Como vimos en el ejemplo inicial, podemos calcular automáticamente el total de una línea de pedido:

INSERT INTO example (quantity, price) VALUES (10, 20.30);
INSERT INTO example (quantity, price) VALUES (1, 70.50);
INSERT INTO example (quantity, price) VALUES (3, 10);
INSERT INTO example (quantity, price) VALUES (5, 13.90);

SELECT * FROM example;

El resultado mostrará los totales calculados automáticamente:

example_id | quantity | price  | total
-----------+----------+--------+-------
1          | 10       | 20.30  | 203.00
2          | 1        | 70.50  | 70.50
3          | 3        | 10.00  | 30.00
4          | 5        | 13.90  | 69.50

Análisis de texto

Las columnas generadas también son útiles para operaciones con texto. Por ejemplo, podemos calcular la longitud de una descripción:

SELECT product_id, name, description_length, 
       SUBSTRING(description, 1, 15) 
FROM products 
ORDER BY RAND() 
LIMIT 10;

Esto nos permite:

  • Filtrar productos por la longitud de su descripción
  • Optimizar la interfaz de usuario según el tamaño del texto
  • Realizar análisis estadísticos sobre los datos textuales
SELECT COUNT(*) 
FROM products 
WHERE description_length < 70;

Consideraciones importantes

Al implementar columnas generadas, debemos tener en cuenta:

  1. Impacto en el rendimiento: Las columnas almacenadas pueden ralentizar las operaciones de escritura, mientras que las virtuales pueden afectar las consultas.

  2. Espacio en disco: Las columnas almacenadas aumentan el tamaño de la tabla.

  3. Complejidad de la expresión: Expresiones muy complejas pueden afectar significativamente el rendimiento.

  4. Indexación: Solo las columnas almacenadas pueden ser indexadas directamente.

Las columnas generadas en MySQL ofrecen una forma elegante de mantener datos derivados sin necesidad de lógica adicional en la aplicación. Esta funcionalidad permite delegar cálculos a la base de datos, mejorando la consistencia y simplificando el código de la aplicación.

¿Has utilizado columnas generadas en tus proyectos? ¿Qué otros casos de uso consideras que podrían beneficiarse de esta funcionalidad? Comparte tu experiencia en los comentarios.

Aportes 0

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?