http://en.wikipedia.org/wiki/Upsert
Wstaw aktualizację przechowywaną proc na SQL Server
Czy jest jakiś sprytny sposób na zrobienie tego w SQLite, o którym nie myślałem?
Zasadniczo chcę zaktualizować trzy z czterech kolumn, jeśli rekord istnieje, jeśli nie istnieje, chcę WSTAWić rekord z wartością domyślną (NUL) dla czwartej kolumny.
Identyfikator jest kluczem podstawowym, więc UPSERT będzie miał tylko jeden rekord.
(Próbuję uniknąć narzutu SELECT, aby ustalić, czy muszę oczywiście ZAKTUALIZOWAĆ, czy WSTAWIĆ)
Propozycje?
Nie mogę potwierdzić tej składni na stronie SQLite dla TABLE CREATE. Nie zbudowałem wersji demo, aby ją przetestować, ale wydaje się, że nie jest obsługiwana.
Gdyby tak było, mam trzy kolumny, więc faktycznie wyglądałoby to tak:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
ale pierwsze dwa obiekty BLOB nie spowodują konfliktu, tylko identyfikator byłby więc więc asusme Blob1 i Blob2 nie zostaną zastąpione (zgodnie z życzeniem)
AKTUALIZACJE w SQLite, gdy powiązanie danych jest kompletną transakcją, co oznacza, że każdy wysłany wiersz do aktualizacji wymaga: Przygotuj / Powiąż / Krok / Zakończ instrukcje w przeciwieństwie do INSERT, który pozwala na użycie funkcji resetowania
Życie obiektu instrukcji przebiega mniej więcej tak:
- Utwórz obiekt za pomocą sqlite3_prepare_v2 ()
- Powiąż wartości z parametrami hosta za pomocą interfejsów sqlite3_bind_.
- Uruchom SQL, wywołując sqlite3_step ()
- Zresetuj instrukcję za pomocą sqlite3_reset (), a następnie wróć do kroku 2 i powtórz.
- Zniszcz obiekt instrukcji za pomocą narzędzia sqlite3_finalize ().
AKTUALIZACJA Zgaduję, że jest powolny w porównaniu do INSERT, ale jak to się ma do SELECT przy użyciu klucza podstawowego?
Być może powinienem użyć polecenia select, aby odczytać czwartą kolumnę (Blob3), a następnie użyć REPLACE, aby napisać nowy rekord mieszający oryginalną czwartą kolumnę z nowymi danymi dla pierwszych 3 kolumn?