在sqlite中声明variables并使用它
我想在sqlite中声明一个variables,并在插入操作中使用它
就像在MS SQL中一样
Declare @name as varchar(10) set name = 'name' Select * from table where name = @name
例如,我将需要得到last_insert_row并在插入中使用它
我发现了一些关于绑定的东西,但是我并没有完全理解它
SQLite不支持本机variables语法,但是使用内存中的临时表可以达到几乎相同的效果。
我在大型项目中使用了下面的方法,像魅力一样工作。
/* 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;
赫尔曼的解决scheme的工作原理,但它可以简化,因为Sqlite允许任何字段上存储任何值types。
这是一个简单的版本,它使用声明为TEXT
Value
字段来存储任何值:
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';
赫尔曼的解决scheme为我工作,但是...
让我混了一下。 我将包括我根据他的回答编写的演示。 我的答案中的附加function包括外键支持,自动递增键和使用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中那样使用variables,但可以使用“参数”。 我希望以下链接是有用的。 绑定值