Клаузата RETURNING
Можете да прочетете официалните документи тук.
Много пъти се оказваме, че искаме да върнем някои данни (вероятно идентификатор), след като вмъкнем записи в нашата база данни. От версия 3.35.0
(2021-03-12), SQLite поддържа RETURNING
клауза, която ви позволява да връщате резултатен ред (или конкретни колони) за всеки модифициран ред на базата данни чрез DELETE
, UPDATE
или INSERT
изявление.
INSERT INTO customers (fullName, birthdateTimestamp, address)
VALUES ('Andrew Mitch', 643911868, '206 Grange Road, Gillingham')
RETURNING *;
Горната заявка, след изпълнение, ще ни върне всяка стойност, вмъкната в базата данни, заедно с id
на всеки ред. По този начин можем да избегнем извършването на друг SELECT
заявка към базата данни. Доста спретнато, а?
Клаузата UPSERT
Можете да прочетете официалните документи тук.
Друга приятна малка функция е UPSERT
клауза. Това беше добавено във версия 3.24.0
(2018-06-04) и причинява INSERT
да се държи или като UPDATE
или no-op
, в случай на UNIQUE CONSTRAINT
или PRIMARY KEY CONSTRAINT
нарушение.
За по-подробно, нека предположим, че имате action_records
таблица, която съдържа всички действия, задействани от потребителите в users
таблица,за конкретна сесия . Когато се задейства ново действие, искате да вмъкнете нов action_record
без грешка или, ако съществуващото И има същото клеймо за време на сесия (това се обработва от ON CONFLICT
клауза), актуализирайте стария. Можете също така по избор да добавите WHERE
изявление, което ще доведе до no-op
, ако не е изпълнено. Заявката по-долу трябва да го направи:
-- Create users table and assign userID and sessionStartTimestamp as a UNIQUE CONSTRAINT.
DROP TABLE IF EXISTS "action_records";
CREATE TABLE IF NOT EXISTS "action_records" (
"id" INTEGER NOT NULL,
"userID" INTEGER NOT NULL,
"sessionStartTimestamp" INTEGER NOT NULL,
"errorMsg" TEXT,
PRIMARY KEY("id" AUTOINCREMENT),
FOREIGN KEY("userID") REFERENCES "users"("id") ON DELETE CASCADE,
UNIQUE(userID, sessionStartTimestamp)
);
-- Insert new record or update the old one based on UNIQUE_CONSTRAINT OF userID & session_start_timestamp
INSERT INTO action_records (userID, errorMsg, sessionStartTimestamp)
VALUES (258, null, 643911868)
ON CONFLICT(userID, sessionStartTimestamp) -- Conflict when a record for the same user and session exists
DO UPDATE SET errorMsg = 'An error occured'
WHERE errorMsg IS NOT NULL -- This will be a no-op in case there is already an error and you don't want to update it
RETURNING *; -- Optionally adding RETURNING to retrieve any number of columns we want
UPSERT &RETURNING комбинирано
Едно нещо, което наистина ми хареса, е фактът, че можете да комбинирате тези клаузи, като просто добавите RETURNING *
в края на заявката. По този начин всеки ред (или посочени колони), вмъкнат или актуализиран, ще бъде върнат.