SQL: Legen Sie nur neue Zeilen/Datensätze in einer Tabelle?
Ich bin Parsen einer json-feed regelmäßig und einfügen muss nur der neueste Benutzer aus dem Futter und ignorieren der vorhandenen Benutzer.
Denke ich, was ich brauche, ist ON DUPLICATE KEY UPDATE
oder INSERT IGNORE
basierend auf einigen gesucht, aber ich bin mir nicht ganz sicher, deshalb Frage ich ja - also zum Beispiel:
users
1 John
2 Bob
Teilweise JSON:
{ userid:1, name:'John' },
{ userid:2, name:'Bob' },
{ userid:3, name:'Jeff' }
Von diesem Futter möchte ich nur einfügen, Jeff. Ich konnte nicht eine einfache Schleife über alle Benutzer und nicht eine einfache SELECT-Abfrage und sehen, ob die Benutzer-id ist bereits in der Tabelle, wenn nicht Mach ich ein INSERT, aber ich vermute, es wird nicht sein, eine effiziente und praktische Methode.
Übrigens, ich bin mit der Zend_Db für die Datenbank-Interaktion, wenn jemand möchte, um zu bieten eine spezifische Antwort 🙂 ich bin nicht dagegen, eine generische strategische Lösung wenn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
ON DUPLICATE KEY UPDATE
alternative können Sie finden die update-vs. einfügen Entscheidung der Datenbank:aktualisieren würde, das Feld name in "Bobby", wenn ein Eintrag mit userid 2 ist bereits vorhanden.
Können Sie es verwenden, als eine alternative zu den
INSERT IGNORE
wenn Sie ein ineffektiv operation, um das UPDATE:Diesem würde nichts tun, wenn userid 2 ist bereits vorhanden, so dass die Warnung und schlucken der anderen Fehler, die Sie bekommen würde, wenn mit
INSERT IGNORE
.Andere alternative wäre
REPLACE
:Dies tun würde, ein normales insert, wenn die Benutzer-id 2 existiert noch nicht. Wenn es vorhanden ist, löschen Sie den alten Eintrag, der erste und fügen Sie dann eine neue ein.
Sich bewusst sein, dass beide Versionen der MySQL-spezifischen Erweiterungen von SQL.
Für das Zend Framework, was ich Tue, ist ein try/catch der insert-Anweisung und weitere Maßnahmen auf der Grundlage der Ausnahme-code:
Definieren Sie die Benutzer-id ein Primärschlüssel oder EINDEUTIGER Schlüssel und verwenden Sie so etwas wie:
Wenn die Benutzer-id 2 bereits existiert, wird es ignorieren und sich auf die nächste einfügen.
Können Sie auch ON DUPLICATE KEY UPDATE auf die Tabelle schema. Eine andere alternative könnte sein, verwenden Sie die REPLACE INTO syntax.
Dieser wird versuchen EINZUFÜGEN, wenn der Datensatz bereits existiert, wird es GELÖSCHT, bevor Sie es wieder.
INSERT IGNORE
unterstützt Zend_Db?IGNORE
wird verursachen, dass die db-engine zur Ausgabe von Warnungen anstelle von Fehlern, sodass die Ausführung der Abfrage wird nicht aufhören. Ein Nachteil dieses Ansatzes ist, dass beliebiger - Fehler wird ignoriert,/drehte sich zu der Warnung, nicht nur einen doppelten Schlüssel.REPLACE
wird nicht machen Sie ein UPDATE bei einem bereits existierenden Schlüssel, es wird ein DELETE gefolgt von einem INSERT.Meine Lösung :
In der Schleife, die Sie tun können, ein update erst, wenn keine Zeilen betroffen sind, bedeutet, dass es einen neuen Eintrag. Verfolgen Sie diese "fehlgeschlagenen updates' dann ein insert von Ihnen als neue Einträge.
Ich bin nicht vertraut mit Zend_Db aber ich nehme an, es zurückgeben kann, ob ein update betroffen, wie viele Zeile(N).