http://en.wikipedia.org/wiki/Upsert
Stored Proc einfügen aktualisieren auf SQL Server
Gibt es eine clevere Möglichkeit, dies in SQLite zu tun, an die ich noch nicht gedacht habe?
Im Grunde 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, so dass es immer nur einen Datensatz für UPSERT geben wird.
(Ich versuche, den Overhead von SELECT zu vermeiden, um festzustellen, ob ich UPDATE oder INSERT durchführen muss)
Vorschläge?
Ich kann die Syntax auf der SQLite-Website 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 Ich nehme also an, dass Blob1 und Blob2 nicht ersetzt werden (wie gewünscht).
UPDATEs in SQLite beim Binden von Daten sind eine vollständige Transaktion, d.h. Jede zu aktualisierende gesendete Zeile erfordert: Prepare/Bind/Step/Finalize-Anweisungen im Gegensatz zu INSERT, das die Verwendung der Reset-Funktion erlaubt
Der Lebenslauf eines Anweisungsobjekts sieht in etwa so aus:
- Erstellen Sie das Objekt mit sqlite3_prepare_v2()
- Binden Sie Werte an Host-Parameter mit sqlite3_bind_ interfaces.
- Führen Sie das SQL durch Aufruf von sqlite3_step() aus.
- Setzen Sie die Anweisung mit sqlite3_reset() zurück, gehen Sie zurück zu Schritt 2 und wiederholen Sie ihn.
- Zerstören Sie das Statement-Objekt mit sqlite3_finalize().
UPDATE ich schätze, ist langsam im Vergleich zu INSERT, aber wie verhält es sich im Vergleich zu SELECT mit dem Primärschlüssel?
Vielleicht sollte ich mit select die vierte Spalte (Blob3) lesen und dann mit REPLACE einen neuen Datensatz schreiben, der die ursprüngliche vierte Spalte mit den neuen Daten für die ersten drei Spalten vermischt?
7 Stimmen
SQLite - UPSERT verfügbar in der Vorabversion refer: sqlite.1065341.n5.nabble.com/
7 Stimmen
UPSERT verfügbar in Version 3.24.0 von SQLite