我想在sqlite的聲明一個變量和MS使用它的插入操作SQLite中聲明變量,並用它
像SQL
Declare @name as varchar(10)
set name = 'name'
Select * from table where name = @name
例如,我將需要得到last_insert_row和使用它插入
我已經找到了一些有關具有約束力,但我真的不完全理解它
我想在sqlite的聲明一個變量和MS使用它的插入操作SQLite中聲明變量,並用它
像SQL
Declare @name as varchar(10)
set name = 'name'
Select * from table where name = @name
例如,我將需要得到last_insert_row和使用它插入
我已經找到了一些有關具有約束力,但我真的不完全理解它
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;
這些[]括號用於什麼? – WindRider
@WindRider:避免與保留字發生衝突。我的習慣,但在這種情況下是不必要的,所以他們被刪除。 –
這有效,但有幾個說法,我在Spatial上試過這個,並且它說你不能在一個事務中改變臨時存儲。另外,我認爲在BEGIN之後你錯過了一個分號。 Tx共享此解決方案。 –
嘗試使用綁定值。您不能像在T-SQL中那樣使用變量,但可以使用「參數」。我希望以下鏈接是有用的。 Binding Values
你可以讓你的答案更豐富提供的例子。鏈接可以移動,但你的例子將在這裏供將來參考。 – Pabluez
赫爾曼的解決方案的工作原理,但它可以簡化,因爲Sqlite允許任何字段上存儲任何值類型。
下面是一個使用聲明爲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';
赫爾曼的解決方案爲我工作,但...
把我混了一點。我將包括我根據他的回答編寫的演示。我答案中的附加功能包括外鍵支持,自動遞增鍵以及使用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;
sqlite不支持這個。 –