sql >> Base de Datos >  >> RDS >> SQLite

Cómo crear una columna calculada en SQLite

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.