HOWTO · SQLite
Tablas Temporales en SQLite
Este artículo analiza en profundidad la creación y el uso de tablas temporales en SQLite.
En esta página
Las tablas temporales de SQLite permiten guardar datos intermedios mientras se trabaja con una base de datos. Cree una con TEMP o TEMPORARY, consulte y modifique sus filas con SQL habitual y elimínela cuando termine. Una tabla temporal pertenece a la conexión de base de datos que la creó, por lo que su duración depende de esa conexión.
Crear una tabla temporal en SQLite
Use CREATE TEMP TABLE (o la forma equivalente CREATE TEMPORARY TABLE) para definir una tabla temporal. El siguiente ejemplo usa el módulo sqlite3, incluido en Python, para completar un flujo de trabajo con SQLite en memoria. La tabla de origen solo hace falta si el SELECT de una instrucción CREATE TABLE AS SELECT consulta una tabla; también puede definir una tabla temporal directamente con columnas y valores.
Ejecute este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("CREATE TEMP TABLE users (user_id INTEGER, name TEXT, age INTEGER)")
connection.executemany(
"INSERT INTO users (user_id, name, age) VALUES (?, ?, ?)",
[(1, "Ari", 30), (2, "Bo", 25)],
)
connection.execute(
"CREATE TEMP TABLE recent_users AS "
"SELECT user_id, name FROM users WHERE age >= 18"
)
rows = connection.execute("SELECT user_id, name, age FROM users ORDER BY user_id").fetchall()
print(rows)
connection.execute("UPDATE users SET age = 31 WHERE user_id = 1")
connection.execute("DELETE FROM users WHERE user_id = 2")
connection.execute("DROP TABLE IF EXISTS temp.users")
connection.close()
El ejemplo de Python crea recent_users con CREATE TEMP TABLE ... AS SELECT mientras users existe en la misma conexión. SQLite deriva las columnas de la nueva tabla del resultado de la consulta. Si una consulta lee una tabla de origen, esta debe existir cuando se ejecuta la instrucción; de lo contrario, no hace falta que haya una tabla previa. TEMP y TEMPORARY son alternativas válidas: elija una de las dos formas y úsela de manera coherente.
Entender el alcance y la duración de las tablas temporales
SQLite guarda las tablas temporales en la base de datos temporal de la conexión. Otras conexiones no comparten la tabla temporal de esa conexión, aunque usen el mismo archivo de base de datos o el mismo nombre de tabla. Una tabla temporal desaparece cuando se cierra la conexión a la que pertenece. Su duración depende de la conexión, no de un tiempo de espera de la sesión de la aplicación; por eso, el código que reutiliza una conexión puede seguir usando la tabla hasta que cierre esa conexión o la elimine explícitamente.
Este alcance hace que una tabla temporal sea útil para resultados intermedios que no deban conservarse como datos permanentes de la aplicación. También significa que, al cerrar una conexión, se descartan las filas temporales que aún necesite. Copie los resultados necesarios a una tabla permanente o recupérelos antes de cerrar la conexión.
Consultar una tabla temporal
Consulte una tabla temporal con la sintaxis habitual de SELECT; por ejemplo, SELECT user_id, name FROM users WHERE age >= 18;. La consulta accede a la tabla temporal si su nombre no entra en conflicto con el de una tabla permanente; para identificarla explícitamente, califíquela como temp.users. Solo se puede consultar desde la conexión a la que pertenece.
También puede usar una expresión de tabla común para alimentar una consulta que lea datos temporales. WITH introduce un resultado con nombre para la instrucción y no se limita a instrucciones que contengan un solo SELECT. Por ejemplo, la consulta integrada WITH adults AS (SELECT user_id, name FROM temp.users WHERE age >= 18) SELECT name FROM adults; lee de la tabla temporal y devuelve los nombres seleccionados. Use un SELECT directo cuando un nombre de consulta intermedio no aporte claridad.
Insertar, actualizar y eliminar filas de una tabla temporal
Use INSERT, UPDATE y DELETE igual que con otras tablas de SQLite, y asegúrese de que cada instrucción se dirija a la tabla temporal. Por ejemplo, INSERT INTO temp.users (user_id, name, age) VALUES (3, 'Cy', 28); añade una fila. Para modificar una fila concreta, use UPDATE temp.users SET age = 29 WHERE user_id = 3;. La condición WHERE limita el cambio a las filas que coincidan; sin ella, la actualización afecta a todas las filas de la tabla de destino.
Para eliminar filas concretas, use DELETE FROM temp.users WHERE user_id = 3;. La sintaxis de SQLite no lleva un asterisco después de DELETE. Si omite WHERE, se eliminan todas las filas de esa tabla temporal, pero la tabla permanece. Estas operaciones solo modifican los datos temporales; no alteran una tabla permanente con el mismo nombre. Si la base de datos también contiene una tabla permanente users, indique con claridad el nombre y el esquema de destino.
Eliminar una tabla temporal de forma segura
Elimine explícitamente una tabla temporal con DROP TABLE temp.users;. El prefijo temp. identifica el esquema temporal y puede ayudar a evitar que se elimine una tabla permanente con el mismo nombre. Si es posible que la tabla ya se haya eliminado, use DROP TABLE IF EXISTS temp.users;. La cláusula IF EXISTS permite ejecutar la instrucción de forma segura cuando esa tabla temporal no existe.
Antes de eliminar la tabla o cerrar su conexión, copie o recupere las filas que quiera conservar. Al eliminarla se borran la tabla temporal y sus filas; cerrar la conexión a la que pertenece también pone fin a su duración. Use una tabla permanente para los datos que deban seguir disponibles después de cerrar esa conexión.