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, коли дані прив'язки є повною транзакцією, тобто кожен відправлений рядок для оновлення вимагає: Підготувати / Зв’язати / Крок / Завершити операції на відміну від INSERT, що дозволяє використовувати функцію скидання
Життя об’єкта висловлювання виглядає приблизно так:
- Створіть об’єкт за допомогою sqlite3_prepare_v2 ()
- Прив’яжіть значення до параметрів хоста за допомогою інтерфейсів sqlite3_bind_.
- Запустіть SQL, зателефонувавши sqlite3_step ()
- Скиньте оператор за допомогою sqlite3_reset (), потім поверніться до кроку 2 та повторіть.
- Знищіть об'єкт оператора за допомогою sqlite3_finalize ().
ОНОВЛЕННЯ Я здогадуюсь повільний порівняно з INSERT, але як він порівняється з SELECT за допомогою первинного ключа?
Можливо, я повинен використати select, щоб прочитати 4-й стовпчик (Blob3), а потім використовувати ЗАМЕНИТИ, щоб написати новий запис, змішуючи оригінальний 4-й стовпець з новими даними для перших 3 стовпців?