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
);
но первые два двоичных объекта не вызовут конфликта, только идентификатор
Так что я asusme Blob1 и Blob2 не будет заменен (по желанию)
ОБНОВЛЕНИЯ в SQLite, когда привязка данных является полной транзакцией, что означает
Каждая отправляемая строка, подлежащая обновлению, требует: Подготовить / Связать / Шаг / Завершить операторы
в отличие от INSERT, который позволяет использовать функцию сброса
Жизнь объекта оператора выглядит примерно так:
- Создать объект с помощью sqlite3_prepare_v2 ()
- Привязка значений к параметрам хоста с использованием интерфейсов sqlite3_bind_.
- Запустите SQL, вызвав sqlite3_step ()
- Сбросьте инструкцию с помощью sqlite3_reset (), затем вернитесь к шагу 2 и повторите.
- Уничтожить объект оператора с помощью sqlite3_finalize ().
ОБНОВЛЕНИЕ Я предполагаю, что медленнее по сравнению с INSERT, но как это сравнить с SELECT с использованием первичного ключа?
Возможно, мне следует использовать select для чтения 4-го столбца (Blob3), а затем использовать REPLACE для записи новой записи, смешивая исходный 4-й столбец с новыми данными для первых 3 столбцов?