2011-10-12 25 views
67

Voglio dichiarare una variabile in SQLite e utilizzarlo in operazione di inserimentoDichiarare variabili in SQLite e usarlo

come in MS SQL

Declare @name as varchar(10) 

set name = 'name' 

Select * from table where name = @name 

Per esempio, ho bisogno di ottenere last_insert_row e l'uso in inserto

ho trovato qualcosa su vincolante, ma non ho davvero pienamente capito

+6

sqlite non supporta questo. –

risposta

68

SQLite non supporta la sintassi della variabile nativa, ma è possibile ottenere praticamente lo stesso utilizzando una tabella temporanea in memoria.

Ho utilizzato l'approccio seguente per progetti di grandi dimensioni e funziona come un fascino.

+0

A cosa servono queste parentesi []? – WindRider

+1

@WindRider: per evitare qualsiasi scontro con parole riservate. Un'abitudine mia ma non necessaria in questo caso, quindi vengono rimossi. –

+0

Questo funziona ma ci sono alcune osservazioni, ho provato questo su spatialite, e lì si dice che non è possibile modificare l'archivio temporaneo all'interno di una transazione. Inoltre, penso che manchi un punto e virgola dopo BEGIN. Tx per condividere questa soluzione. –

1

Provare a utilizzare i valori di legame. Non è possibile utilizzare le variabili come si fa in T-SQL ma è possibile utilizzare "parametri". Spero che il seguente link sia utile. Binding Values

+18

puoi rendere la tua risposta più ricca fornendo esempi. I collegamenti possono essere spostati ma i tuoi esempi saranno qui per riferimento futuro. – Pabluez

34

La soluzione di Herman funziona, ma può essere semplificata perché Sqlite consente di memorizzare qualsiasi tipo di valore su qualsiasi campo.

Ecco una versione più semplice che utilizza uno Value campo dichiarato come TEXT per memorizzare qualsiasi valore:

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'; 
5

soluzione di Herman ha lavorato per me, ma il ... mi aveva confuso per un po '. Sto includendo la demo che ho elaborato in base alla sua risposta. Le funzionalità aggiuntive nella mia risposta includono il supporto per le chiavi esterne, i tasti di incremento automatico e l'uso della funzione last_insert_rowid() per ottenere l'ultima chiave generata automaticamente in una transazione.

mio bisogno di queste informazioni è venuto quando mi ha colpito una transazione che ha richiesto tre chiavi esterne, ma ho potuto ottenere solo l'ultimo 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; 
Problemi correlati