Quiero declarar una variable en SQLite y usarla en insert
funcionamiento.
Como en MS SQL:
declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
Por ejemplo, necesitaré obtenerlo last_insert_row
y usarlo insert
.
Encontré algo sobre la vinculación, pero realmente no lo entendí completamente.
sql
sqlite
variables
declaration
Muhammad Nour
fuente
fuente
Respuestas:
SQLite no admite la sintaxis de variables nativas, pero puede lograr prácticamente lo mismo utilizando una tabla temporal en memoria.
He utilizado el siguiente enfoque para proyectos grandes y funciona como un encanto.
/* Create in-memory temp table for variables */ BEGIN; PRAGMA temp_store = 2; CREATE TEMP TABLE _Variables(Name TEXT PRIMARY KEY, RealValue REAL, IntegerValue INTEGER, BlobValue BLOB, TextValue TEXT); /* Declaring a variable */ INSERT INTO _Variables (Name) VALUES ('VariableName'); /* Assigning a variable (pick the right storage class) */ UPDATE _Variables SET IntegerValue = ... WHERE Name = 'VariableName'; /* Getting variable value (use within expression) */ ... (SELECT coalesce(RealValue, IntegerValue, BlobValue, TextValue) FROM _Variables WHERE Name = 'VariableName' LIMIT 1) ... DROP TABLE _Variables; END;
fuente
PRAGMA temp_store
configuración. De hecho, de acuerdo con los documentos en línea , la configuración predeterminada es almacenar archivos temporalmente en el disco (que incluye archivos para tablas e índices temporales).La solución de Herman funciona, pero se puede simplificar porque Sqlite permite almacenar cualquier tipo de valor en cualquier campo.
Aquí hay una versión más simple que usa un
Value
campo declarado comoTEXT
para almacenar cualquier valor:CREATE TEMP TABLE IF NOT EXISTS Variables (Name TEXT PRIMARY KEY, Value TEXT); INSERT OR REPLACE INTO Variables VALUES ('VarStr', 'Val1'); INSERT OR REPLACE INTO Variables VALUES ('VarInt', 123); INSERT OR REPLACE INTO Variables VALUES ('VarBlob', x'12345678'); SELECT Value FROM Variables WHERE Name = 'VarStr' UNION ALL SELECT Value FROM Variables WHERE Name = 'VarInt' UNION ALL SELECT Value FROM Variables WHERE Name = 'VarBlob';
fuente
Para una variable de solo lectura (es decir, un valor constante establecido una vez y utilizado en cualquier lugar de la consulta), use una expresión de tabla común (CTE).
WITH const AS (SELECT 'name' AS name, 10 AS more) SELECT table.cost, (table.cost + const.more) AS newCost FROM table, const WHERE table.name = const.name
Cláusula SQLite WITH
fuente
La solución de Herman funcionó para mí, pero
...
me confundió un poco. Incluyo la demostración que preparé según su respuesta. Las características adicionales en mi respuesta incluyen soporte de clave externa, claves de incremento automático y el uso de lalast_insert_rowid()
función para obtener la última clave generada automáticamente en una transacción.Mi necesidad de esta información surgió cuando llegué a una transacción que requería tres claves externas pero solo pude obtener la última con
last_insert_rowid()
.PRAGMA foreign_keys = ON; -- sqlite foreign key support is off by default PRAGMA temp_store = 2; -- store temp table in memory, not on disk CREATE TABLE Foo( Thing1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ); CREATE TABLE Bar( Thing2 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(Thing2) REFERENCES Foo(Thing1) ); BEGIN TRANSACTION; CREATE TEMP TABLE _Variables(Key TEXT, Value INTEGER); INSERT INTO Foo(Thing1) VALUES(2); INSERT INTO _Variables(Key, Value) VALUES('FooThing', last_insert_rowid()); INSERT INTO Bar(Thing2) VALUES((SELECT Value FROM _Variables WHERE Key = 'FooThing')); DROP TABLE _Variables; END TRANSACTION;
fuente
Intente usar Binding Values. No puede usar variables como lo hace en T-SQL, pero puede usar "parámetros". Espero que el siguiente enlace sea de utilidad. Valores vinculantes
fuente