Acerca de las Columnas Generadas
Syntax Sintácticamente, las columnas generadas se designan mediante un “GENERATED ALWAYS” column-constraint . Por ejemplo:
CREATE TABLE t1( a INTEGER PRIMARY KEY, b INT, c TEXT, d INT GENERATED ALWAYS AS (a*abs(b)) VIRTUAL, e TEXT GENERATED ALWAYS AS (substr(c,b,b+1)) STORED);La declaración anterior tiene tres columnas ordinarias, “a” (la CLAVE PRIMARIA), “b” y “c” , y dos columnas generadas “d” y “e” .
Las palabras clave “GENERATED ALWAYS” al principio de la restricción y la palabra clave “VIRTUAL” o “STORED” al final son todas opcionales. Sólo se requieren la palabra clave “AS” y la expresión entre paréntesis. Si se omite la palabra clave “VIRTUAL” o “STORED” final, VIRTUAL es el valor predeterminado. Por lo tanto, el ejemplo anterior podría simplificarse a simplemente:
CREATE TABLE t1( a INTEGER PRIMARY KEY, b INT, c TEXT, d INT AS (a*abs(b)), e TEXT AS (substr(c,b,b+1)) STORED);Columnas Virtuales versus Almacenadas
Las columnas generadas pueden ser “virtuales” o “almacenadas”. El valor de una columna VIRTUAL se calcula cuando se lee, mientras que el valor de una columna ALMACENADA se calcula cuando se escribe en la fila.
Desde el punto de vista de SQL, las columnas ALMACENADA y VIRTUAL son casi exactamente iguales. Las consultas realizadas contra cualquier clase de columna generada producen los mismos resultados. La única diferencia funcional es que no se pueden agregar nuevas columnas ALMACENADAS usando el comando ALTER TABLE ADD COLUMN. Solo se pueden agregar columnas VIRTUALES usando ALTER TABLE.
Esto fue sacado de la documentación oficial de SQLite, te recomiendo leerla.