Aktualisieren oder Einfügen ohne bekannten Primärschlüssel
Wenn Sie bereits einen eindeutigen oder primären Schlüssel haben, sind die anderen Antworten mit entweder INSERT INTO ... ON DUPLICATE KEY UPDATE ...
o REPLACE INTO ...
sollte gut funktionieren (beachten Sie, dass replace into löscht, wenn vorhanden, und dann einfügt - somit werden vorhandene Werte nicht teilweise aktualisiert).
Aber wenn Sie die Werte für some_column_id
y some_type
die in ihrer Kombination bekanntermaßen einzigartig sind. Und Sie wollen aktualisieren some_value
wenn vorhanden, oder einfügen, wenn nicht vorhanden. Und Sie möchten dies in nur einer Abfrage tun (um eine Transaktion zu vermeiden). Dies könnte eine Lösung sein:
INSERT INTO my_table (id, some_column_id, some_type, some_value)
SELECT t.id, t.some_column_id, t.some_type, t.some_value
FROM (
SELECT id, some_column_id, some_type, some_value
FROM my_table
WHERE some_column_id = ? AND some_type = ?
UNION ALL
SELECT s.id, s.some_column_id, s.some_type, s.some_value
FROM (SELECT NULL AS id, ? AS some_column_id, ? AS some_type, ? AS some_value) AS s
) AS t
LIMIT 1
ON DUPLICATE KEY UPDATE
some_value = ?
Grundsätzlich läuft die Abfrage so ab (weniger kompliziert, als es vielleicht aussieht):
- Wählen Sie eine vorhandene Zeile über die Schaltfläche
WHERE
Klausel übereinstimmen.
- Vereinigen Sie dieses Ergebnis mit einer potenziellen neuen Zeile (Tabelle
s
), wobei die Spaltenwerte explizit angegeben werden (s.id ist NULL, so dass ein neuer Auto-Inkrement-Bezeichner erzeugt wird).
- Wenn eine vorhandene Zeile gefunden wird, wird die potenzielle neue Zeile aus der Tabelle
s
wird verworfen (aufgrund von LIMIT 1 in der Tabelle t
), und es wird immer eine ON DUPLICATE KEY
die UPDATE
die some_value
Spalte.
- Wenn keine vorhandene Zeile gefunden wird, wird die potenzielle neue Zeile eingefügt (wie in der Tabelle
s
).
Hinweis: Jede Tabelle in einer relationalen Datenbank sollte mindestens eine primäre automatisch inkrementierende Tabelle haben. id
Spalte. Wenn Sie diese nicht haben, fügen Sie sie hinzu, auch wenn Sie sie auf den ersten Blick nicht brauchen. Sie wird für diesen "Trick" auf jeden Fall benötigt.