Algunos sistemas de gestión de bases de datos (DBMS) incluyen una función denominada columnas generadas.
También conocidas como "columnas calculadas", las columnas generadas son similares a una columna normal, excepto que el valor de una columna generada se deriva de una expresión que calcula valores de otras columnas.
En otras palabras, el valor de una columna generada se calcula a partir de otras columnas.
Ejemplo
Aquí hay un ejemplo básico para demostrar cómo funcionan las columnas generadas.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Este ejemplo se creó en SQLite y usa la sintaxis de SQLite para crear una columna generada. Esta sintaxis usa el GENERATED ALWAYS
restricción de columna.
El GENERATED ALWAYS
la parte es opcional en SQLite, por lo que podría usar AS
.
En realidad, el GENERATED ALWAYS
La parte también es opcional en MySQL, y ni siquiera está definida en TSQL (la extensión SQL para SQL Server), por lo que AS
la palabra clave es todo lo que necesita (junto con la expresión real).
La expresión es lo que determina el valor real que contendrá la columna. En mi ejemplo, la parte que dice (Qty * Price)
es la expresión que determina ese valor.
En este caso, es simplemente multiplicar la cantidad (número de cada producto) por el precio de cada producto.
Por lo tanto, esta columna generada contiene el valor total de cada stock en el inventario.
Si insertamos datos y los seleccionamos, podemos ver el valor calculado de la columna generada.
INSERT INTO Products VALUES
(1, 'Hammer', 10, 9.99),
(2, 'Saw', 5, 11.34),
(3, 'Wrench', 7, 37.00),
(4, 'Chisel', 9, 23.00),
(5, 'Bandage', 70, 120.00);
SELECT * FROM Products;
Resultado:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 10 9.99 99.9 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
Si nos fijamos en la primera fila, podemos ver que hay 10 martillos a un precio de 9,99 cada uno. La columna generada multiplica estos dos valores y terminamos con 99,9.
Si reducimos el número de martillos, la columna generada produciría un valor diferente.
He aquí un ejemplo.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Resultado:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 5 9.99 49.95 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
En este caso, reduje el número de martillos a 5 y, por lo tanto, la columna generada calculó un valor de 49,95.
Tipos de columnas generadas
Hay dos tipos de columnas generadas; almacenados y virtuales.
Algunos DBMS pueden usar una terminología ligeramente diferente, por ejemplo, SQL Server usa el término "persistente" en lugar de "almacenado". De cualquier manera, se refiere a lo mismo.
VIRTUAL
:Los valores de las columnas no se almacenan, pero se evalúan cuando se leen las filas.STORED
:los valores de columna se evalúan y almacenan cuando se insertan o actualizan filas.
STORED
por lo tanto, las columnas requieren espacio de almacenamiento, mientras que VIRTUAL
las columnas no.
Sin embargo, esto también significa que VIRTUAL
las columnas usan más ciclos de CPU cuando se leen.
Beneficios de las columnas generadas
Las columnas generadas pueden ahorrar tiempo al escribir consultas, reducir errores y mejorar el rendimiento.
Las columnas generadas se pueden utilizar como una forma de simplificar y unificar las consultas. Una condición compleja puede definirse como una columna generada y luego consultarse desde múltiples consultas en la tabla. Esto ayuda a garantizar que todos usen exactamente la misma condición.
Las columnas generadas almacenadas se pueden usar como un caché materializado para condiciones complicadas que son costosas de calcular sobre la marcha.
Limitaciones de las columnas generadas
Las columnas generadas generalmente vienen con limitaciones en comparación con las columnas normales, aunque el DBMS puede determinar el alcance de las limitaciones.
Por ejemplo, las columnas generadas generalmente solo pueden calcular valores de columnas dentro de la misma fila. Sin embargo, esta limitación se puede superar (al menos en SQL Server) mediante el uso de una función definida por el usuario como parte de la expresión de la columna calculada.
Consulte los enlaces a continuación para obtener más información sobre la implementación de columnas generadas en varios DBMS.
Documentación Oficial
Aquí está la documentación de algunos DBMS populares que incluye las limitaciones de su implementación de columnas generadas:
- Columnas calculadas en SQL Server
- Columnas generadas en PostgreSQL (Versión 12)
- Columnas generadas en MySQL (Versión 8.0)
- Columnas generadas en SQLite