Я хочу объявить переменную в sqlite и использовать ее в операции вставки
как в MS SQL
Declare @name as varchar(10)
set name = 'name'
Select * from table where name = @name
Например, мне нужно будет получить last_insert_row и использовать его в insert
Я нашел кое-что о привязке, но я действительно не понял его полностью.
SQLite не поддерживает собственный синтаксис переменных, но вы можете добиться практически того же, используя таблицу temp in-memory temp.
Я использовал подход ниже для больших проектов и работает как шарм.
/* 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;
Решение Herman работает, но его можно упростить, поскольку Sqlite позволяет хранить любой тип значения в любом поле.
Вот более простая версия, которая использует одно поле Value
, объявленное как TEXT
, для сохранения любого значения:
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';
Решение Herman работало для меня, но ...
меня немного перепутали. Я включил демо, на котором я работал, основываясь на его ответе. Дополнительные функции в моем ответе включают поддержку внешнего ключа, автоинкрементные клавиши и использование функции last_insert_rowid()
для получения последнего автоматически сгенерированного ключа в транзакции.
Моя потребность в этой информации возникла, когда я наткнулся на транзакцию, которая потребовала трех внешних ключей, но я мог получить только последний с 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;
Попробуйте использовать значения привязки. Вы не можете использовать переменные, как в T-SQL, но вы можете использовать "параметры". Я надеюсь, что следующая ссылка полезна. Значения привязки