La compatibilidad con columnas generadas se agregó a SQLite en la versión 3.31.0, que se lanzó el 22 de enero de 2020.
Las columnas generadas y las columnas calculadas son lo mismo. Son columnas cuyos valores son una función de otras columnas en la misma fila.
En SQLite, las columnas generadas se crean usando GENERATED ALWAYS
restricción de columna al crear o modificar la tabla.
Hay dos tipos de columna generada; STORED
y VIRTUAL
. Solo VIRTUAL
se pueden agregar columnas al modificar una tabla. Ambos tipos se pueden agregar al crear una tabla.
Ejemplo
Aquí hay un ejemplo para demostrarlo.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Si recibe el siguiente error:
Error: near "AS": syntax error
Lo más probable es que necesite actualizar a una versión posterior de SQLite. Las columnas generadas solo se introdujeron en SQLite 3.31.0.
Ahora vamos a insertar datos y seleccionarlos.
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
Este es un ejemplo simple y ciertamente puede usar expresiones más complejas, por ejemplo, las que usan funciones integradas.
Virtual frente a almacenado
De forma predeterminada, la columna calculada se crea como VIRTUAL
columna.
También tienes la opción de crear un STORED
columna.
El valor de un VIRTUAL
columna se calcula cuando se lee, mientras que el valor de un STORED
la columna se calcula cuando se escribe la fila.
Puedes usar explícitamente VIRTUAL
o STORED
en la definición de su columna para indicar cuál debería ser. Si omites esto, será VIRTUAL
.
Así es como podemos cambiar el ejemplo anterior para usar un STORED
columna.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Independientemente de si es un STORED
columna o VIRTUAL
, ingresar y seleccionar los datos es exactamente lo mismo.
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
Actualización de datos en una columna generada
No puede actualizar los datos directamente en una columna calculada. Es decir, no puede escribir directamente en la columna calculada.
Para actualizar sus datos, debe actualizar los datos de las columnas subyacentes que se utilizan en la expresión de la columna calculada.
Este es un ejemplo de cómo actualizar los datos utilizados en los ejemplos anteriores.
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 la cantidad de martillos disponibles a 5. Esto a su vez redujo el valor total de los martillos en stock y el valor en la columna generada (TotalValue ) reducido de 99,99 a 49,95.