我想在SQLite中声明一个变量并在insert
操作中使用它。
就像在MS SQL中一样:
declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
例如,我将需要在中获取last_insert_row
和使用它insert
。
我发现了一些有关绑定的信息,但是我并没有完全理解它。
我想在SQLite中声明一个变量并在insert
操作中使用它。
就像在MS SQL中一样:
declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
例如,我将需要在中获取last_insert_row
和使用它insert
。
我发现了一些有关绑定的信息,但是我并没有完全理解它。
Answers:
SQLite不支持本机变量语法,但是您可以使用内存中的临时表实现几乎相同的效果。
对于大型项目,我使用了下面的方法,并且效果很不错。
/* 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';
对于只读变量(即,一次设置并在查询中任何地方使用的常量值),请使用公用表表达式(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
赫尔曼的解决方案对我有用,但是...
让我有些困惑。根据他的回答,我将包括我自己制作的演示。我的答案中的其他功能包括外键支持,自动递增键,以及使用该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中那样使用变量,但可以使用“参数”。我希望以下链接有用。绑定值