Объявите переменную в sqlite и используйте ее


Я хочу объявить переменную в sqlite и использовать ее в операции вставки

как в MS SQL

Declare @name as varchar(10)

set name = 'name'

Select * from table where name = @name

например, мне нужно будет получить last_insert_row и использовать его в insert

Я нашел что-то о привязке, но я не полностью понял

4 72

4 ответа:

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;

решение Германа работает, но его можно упростить, потому что Sqlite позволяет хранить любой тип значения в любом поле.

вот более простая версия, которая использует один

решение Германа сработало для меня, но ... меня немного перепутали. Я включаю демо, которое я разработал на основе его ответа. Дополнительные функции в моем ответе включают поддержку внешнего ключа, автоматическое увеличение ключей и использование 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, но вы можете использовать "параметры". Я надеюсь, что следующая ссылка полезна.Значения Привязки