2009-03-30 26 views
23

Ein bisschen seltsam, um es so kurz zu fassen, heh.Erstellen, wenn ein Eintrag nicht existiert, sonst aktualisieren?

Wie auch immer, was ich will, ist im Grunde einen Eintrag in einer Tabelle zu aktualisieren, wenn es existiert, andernfalls um einen neuen Eintrag zu erstellen, der dieselben Daten enthält.

Ich weiß, das ist einfach, aber ich bin relativ neu in MySQL in Bezug darauf, wie sehr ich es benutzt habe: P

Antwort

22

Use 'REPLACE INTO':

REPLACE INTO table SET id = 42, foo = 'bar'; 

Siehe mehr in der MySQL documentation

+0

Es erstellt mehr als auf Eintrag für REPLACE INTO Benutzer SET ip = '$ Uip', lastcheck = '$ tim' – unrelativity

+0

IS IP oder lastcheck entweder einen Primärschlüssel oder eindeutigen Index? – carl

+0

Dann wird das Verhalten erwartet, das Sie erleben. Ein Feld muss entweder primär oder eindeutig sein, damit dies funktioniert. Wie würde MySQL andernfalls Dubletten vermeiden? Es scheint, als ob Sie die user_id in dieser Tabelle (als Primärschlüssel) haben sollten, die Sie auch in Ihre Ersetzung einfügen. – carl

2

up Schauen REPLACE im MySQL-Handbuch.

REPLACE funktioniert genau wie INSERT, außer, dass, wenn eine alte Zeile in der Tabelle den gleichen Wert wie eine neue Zeile für einen Primärschlüssel oder einen eindeutigen Index hat, die alte Zeile vor dem neuen gelöscht Zeile ist eingefügt. Siehe Abschnitt 12.2.5, "INSERT Syntax".

REPLACE ist eine MySQL-Erweiterung des SQL-Standards . Es fügt entweder ein oder löscht und fügt ein. Für eine andere MySQL Erweiterung auf SQL-Standard - das entweder Einfügungen oder Updates - siehe Section 12.2.5.3, "INSERT ... ON DUPLICATE KEY UPDATE Syntax".

Wenn Sie die folgende INSERT-Abfrage haben:

INSERT INTO table (id, field1, field2) VALUES (1, 23, 24) 

Dies ist die Abfrage REPLACE ist, sollten Sie laufen:

REPLACE INTO table (id, field1, field2) VALUES (1, 23, 24) 
58

Viele Entwickler führen immer noch eine Abfrage aus, um zu überprüfen, ob ein Feld in einer Tabelle vorhanden ist, und führen dann eine Einfüge- oder Aktualisierungsabfrage gemäß dem Ergebnis der ersten Abfrage aus. Versuchen Sie es mit der ON DUPLICATE KEY-Syntax, das ist viel schneller und besser als das Ausführen von 2 Abfragen.Weitere Daten können here

INSERT INTO table (a, b, c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c = 9 gefunden werden;

wenn Sie für den gleichen Wert halten c Sie ein Update mit dem gleichen Wert tun

INSERT INTO Tabelle (a, b, c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c = 6;

der Unterschied zwischen 'ersetzen' und 'auf doppelten Schlüssel':

ersetzen: Einsätze oder Löschungen und fügt

auf doppelten Schlüssel: Einfügungen oder Aktualisierungen

Wenn Ihre Tabelle keinen Primärschlüssel oder eindeutigen Schlüssel hat, macht das Ersetzen keinen Sinn.

Sie können auch die Funktion VALUES verwenden, um zu vermeiden, dass Sie die tatsächlichen Werte zweimal angeben müssen. Z.B. statt

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;

können Sie

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

verwenden Wo VALUES(c) auf den Wert prevously angegeben bewerten wird (6).

+4

IMO, beantwortet diese Antwort besser die Frage. Wenn Sie ein UPDATE wirklich wollen, wenn die Zeile bereits existiert, ist REPLACE destruktiv: "REPLACE funktioniert genau wie INSERT, außer wenn eine alte Zeile in der Tabelle den gleichen Wert wie eine neue Zeile für einen PRIMARY KEY oder einen UNIQUE Index hat alte Zeile wird gelöscht, bevor die neue Zeile eingefügt wird. " (MySQL Handbuch) – richardkmiller

+3

+1: viel bessere Antwort als die angenommene Antwort – mathieu

+0

Beachten Sie, dass es nicht genau "Einfügen oder Aktualisieren", sondern "Einfügen oder Löschen + Einfügen", was bedeutet, dass dies keine richtige Lösung ist, wenn Sie nur a Teil der Spalten: Im Gegensatz zu einer Aktualisierung wird der Wert von Spalten ohne angegebene Werte auf Standardwert gesetzt (und geht verloren) –

8

Wie die anderen gesagt haben, REPLACE ist der Weg zu gehen. Seien Sie vorsichtig bei der Verwendung, da es tatsächlich eine DELETE und INSERT auf dem Tisch ist. Dies ist die meiste Zeit in Ordnung, aber wenn Sie Fremdschlüssel mit Einschränkungen wie ON DELETE CASCADE haben, kann dies einige große Probleme verursachen.

Verwandte Themen