SQL: Eine Abfrage einfügen neuen Datensatz oder ersetzen nur einige Felder
Meine Datenbank ist SQLite, aber ich bin sicher, die Frage gilt für SQL im Allgemeinen. Sagen wir, ich habe eine Tabelle "Schüler" mit den Spalten "id" (Primärschlüssel), "name", "ausgewählt". Von Zeit zu Zeit, die ich brauche zu aktualisieren, sagt die Tabelle aus der externen Quelle, aber ich erhalten nur eine Tabelle von ids und Namen. Wenn diese Aktualisierung erfolgt für jede Zeile, die ich brauche, um:
-
Wenn keine Zeile mit der gleichen id vorhanden ist, fügen Sie neue Zeile, um der Tabelle mit default-Wert für "ausgewählte"
-
Wenn die Zeile bereits vorhanden ist, aktualisieren Sie nur "name" - Feld, untouching "ausgewählt"
Sollte dies in einem batch mit einer einzigen Abfrage mit Platzhaltern. Auch, der Fall ist, vereinfacht, eigentlich muss ich schreiben, universellen code für die Aktualisierung einer Reihe von Tabellen, die jeweils mehrere Felder aktualisiert werden und einige "lokale" - Felder.
Leider, ich kann nicht finden einen geeigneten Weg, um auszudrücken, meinen Wunsch zu SQLite. Wenn ich ERSETZEN-Abfrage:
INSERT OR REPLACE INTO students (id, name) VALUES (:id, :name)
diese beseitigen den "ausgewählten" Bereich, während, wenn ich UPDATE:
UPDATE students SET name = :name WHERE id = :id
diese wird nicht fügen Sie neue Zeilen.
Also, was ist der richtige Weg, es zu tun? Bekam ich das Gefühl, mir fehlt etwas sehr-sehr einfach, und ich werde mich sehr, sehr dumm, wenn ich die Antwort bekommen 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
INSERT or REPLACE
ist nicht universal. Jede DB hat seine eigene syntax, die für Sie (MERGE für SQL Server 2005 und später, zum Beispiel), und viele haben es nicht alle. Die universal-Lösung ist für diese beiden Aussagen.gefolgt von
Ich in der Regel verwenden Sie LEFT JOIN für die INSERT-und DELETE und JOIN für die updates. Beachten Sie, dass es passiert, als eine große Abfrage, nicht von einem Datensatz base: