SQLite
 sql >> база данни >  >> RDS >> SQLite

Бърза публикация за SQLite UPSERT и новата клауза RETURNING.

Клаузата 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 * в края на заявката. По този начин всеки ред (или посочени колони), вмъкнат или актуализиран, ще бъде върнат.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да активирате поддръжка на чужд ключ в SQLite

  2. Android ListView:как да избегнем заявка към база данни в bindView()? Трябва да се извлекат един към много данни за връзката

  3. Как работи Coalesce() в SQLite

  4. Инициализация на SQLite и база данни

  5. 2 начина за връщане само на числовите стойности от колона на базата данни на SQLite