http://en.wikipedia.org/wiki/Upsert
Fügen Sie den auf SQL Server gespeicherten Update-Prozess ein
Gibt es eine clevere Möglichkeit, dies in SQLite zu tun, an die ich nicht gedacht habe?
Grundsätzlich möchte ich drei von vier Spalten aktualisieren, wenn der Datensatz vorhanden ist. Wenn er nicht vorhanden ist, möchte ich den Datensatz mit dem Standardwert (NUL) für die vierte Spalte einfügen.
Die ID ist ein Primärschlüssel, sodass UPSERT immer nur einen Datensatz enthält.
(Ich versuche, den Overhead von SELECT zu vermeiden, um festzustellen, ob ich offensichtlich AKTUALISIEREN oder EINFÜGEN muss.)
Vorschläge?
Ich kann diese Syntax auf der SQLite-Site für TABLE CREATE nicht bestätigen. Ich habe keine Demo erstellt, um sie zu testen, aber sie scheint nicht unterstützt zu werden.
Wenn es so wäre, hätte ich drei Spalten, so dass es tatsächlich so aussehen würde:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
aber die ersten beiden Blobs verursachen keinen Konflikt, nur die ID würde also Asusme Blob1 und Blob2 würden nicht ersetzt (wie gewünscht)
UPDATEs in SQLite, wenn das Binden von Daten eine vollständige Transaktion ist, was bedeutet, dass jede zu aktualisierende gesendete Zeile Folgendes erfordert: Prepare / Bind / Step / Finalize-Anweisungen im Gegensatz zu INSERT, die die Verwendung der Reset-Funktion ermöglichen
Das Leben eines Anweisungsobjekts sieht ungefähr so aus:
- Erstellen Sie das Objekt mit sqlite3_prepare_v2 ()
- Binden Sie Werte mithilfe von sqlite3_bind_-Schnittstellen an Hostparameter.
- Führen Sie die SQL aus, indem Sie sqlite3_step () aufrufen.
- Setzen Sie die Anweisung mit sqlite3_reset () zurück, kehren Sie dann zu Schritt 2 zurück und wiederholen Sie den Vorgang.
- Zerstören Sie das Anweisungsobjekt mit sqlite3_finalize ().
UPDATE Ich vermute, es ist langsam im Vergleich zu INSERT, aber wie ist es im Vergleich zu SELECT mit dem Primärschlüssel?
Vielleicht sollte ich die Auswahl verwenden, um die 4. Spalte (Blob3) zu lesen, und dann REPLACE verwenden, um einen neuen Datensatz zu schreiben, der die ursprüngliche 4. Spalte mit den neuen Daten für die ersten 3 Spalten mischt?