http://en.wikipedia.org/wiki/Upsert
Вставить обновление хранимой процедуры на SQL Server
Есть ли какой-нибудь умный способ сделать это в SQLite, о котором я не думал?
В основном я хочу обновить три из четырех столбцов, если запись существует, если она не существует, я хочу вставить запись со значением по умолчанию (NUL) для четвертого столбца.
Идентификатор является первичным ключом, поэтому в UPSERT будет только одна запись.
(Я пытаюсь избежать издержек SELECT, чтобы определить, нужно ли мне ОБНОВИТЬ или ВСТАВИТЬ, очевидно)
Предложения?
Я не могу подтвердить, что Синтаксис на сайте SQLite для TABLE CREATE. Я не построил демо-версию, чтобы проверить его, но он не поддерживается ...
Если бы это было так, у меня есть три столбца, так что на самом деле это будет выглядеть так:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
но первые два больших двоичных объекта не вызовут конфликта, только идентификатор будет таким образом. Поэтому я не могу заменить Blob1 и Blob2 (по желанию)
ОБНОВЛЕНИЯ в SQLite, когда привязка данных является полной транзакцией, что означает, что каждая отправляемая строка, подлежащая обновлению, требует: операторов Prepare / Bind / Step / Finalize в отличие от INSERT, которая позволяет использовать функцию сброса
Жизнь объекта оператора выглядит примерно так:
- Создайте объект с помощью sqlite3_prepare_v2 ()
- Привязать значения к параметрам хоста, используя интерфейсы sqlite3_bind_.
- Запустите SQL, вызвав sqlite3_step ()
- Сбросьте инструкцию с помощью sqlite3_reset (), затем вернитесь к шагу 2 и повторите.
- Уничтожьте объект оператора с помощью sqlite3_finalize ().
ОБНОВЛЕНИЕ Я предполагаю, медленный по сравнению с INSERT, но как это сравнить с SELECT с использованием первичного ключа?
Возможно, мне следует использовать select, чтобы прочитать 4-й столбец (Blob3), а затем использовать REPLACE, чтобы написать новую запись, смешивая исходный 4-й столбец с новыми данными для первых 3 столбцов?