Ich möchte einer Datenbanktabelle eine Zeile hinzufügen, aber wenn eine Zeile mit demselben eindeutigen Schlüssel vorhanden ist, möchte ich die Zeile aktualisieren.
Zum Beispiel:
insert into table (id, name, age) values(1, "A", 19)
Angenommen, der eindeutige Schlüssel lautet id
, und in meiner Datenbank gibt es eine Zeile mit id = 1
. In diesem Fall möchte ich diese Zeile mit diesen Werten aktualisieren. Normalerweise gibt dies einen Fehler.
Wenn ich es benutze insert IGNORE
, wird der Fehler ignoriert, aber es wird immer noch nicht aktualisiert.
mysql
sql
insert-update
upsert
Keshan
quelle
quelle
Antworten:
Verwenden
INSERT ... ON DUPLICATE KEY UPDATE
ABFRAGE:
quelle
affected row count
Ergebnisse in2
wann (auf doppelten Schlüssel) einreihig erfolgreich zu aktualisieren? Hat sonst noch jemand dieses Ergebnis gehabt? (Die Daten werden korrekt aktualisiert: was bedeutet, dass nur 1 Zeile aktualisiert wird)ON DUPLICATE KEY UPDATE
die betroffenen Zeilen um 2 erhöhen. Es wird 0 gemeldet, wenn tatsächlich nichts aktualisiert wird (wie beim regulärenUPDATE
).Schauen Sie sich REPLACE an
http://dev.mysql.com/doc/refman/5.0/en/replace.html
quelle
Verwenden Sie bei Verwendung der Stapeleinfügung die folgende Syntax:
quelle
VALUES(name)
dies nicht funktioniert, können Sie versuchenname = 'name_value',...;
Probieren Sie es aus:
Hoffe das hilft.
quelle
Versuche dies:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Hinweis:
Wenn hier id der Primärschlüssel ist, werden nach dem ersten Einfügen bei
id='1'
jedemid='1'
Einfügeversuch Name und Alter aktualisiert, und das Alter des vorherigen Namens ändert sich.quelle
Alle diese Lösungen funktionieren in Bezug auf Ihre Frage.
Wenn Sie Einzelheiten zu dieser Erklärung erfahren möchten, besuchen Sie diesen Link
quelle
REPLACE
ist im verknüpften Dokument nicht dokumentiert.Bei Verwendung von SQLite:
Vorausgesetzt, das
id
ist der Primärschlüssel. Oder es wird einfach eine weitere Zeile eingefügt. Siehe INSERT (SQLite).quelle
replace into
genau ist, ist "Einfügen in oder Aktualisieren, wenn vorhanden". @OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
Nur weil ich hier nach dieser Lösung gesucht habe, aber um von einer anderen identisch strukturierten Tabelle zu aktualisieren (in meinem Fall Website-DB auf Live-DB testen):
Wie an anderer Stelle erwähnt, müssen nur die Spalten eingefügt werden, die Sie aktualisieren möchten
ON DUPLICATE KEY UPDATE
.Keine Notwendigkeit, die Spalten im
INSERT
oderSELECT
aufzulisten, obwohl ich damit einverstanden bin, ist es wahrscheinlich eine bessere Praxis.quelle
Falls Sie ein
non-primary
Feld als Kriterium / Bedingung für erstellen möchtenON DUPLICATE
, können Sie einenUNIQUE INDEX
Schlüssel für diese Tabelle erstellen, um das auszulösenDUPLICATE
.Wenn Sie zwei Felder kombinieren möchten, um sie in der Tabelle eindeutig zu machen, können Sie dies erreichen, indem Sie dem letzten Parameter mehr hinzufügen.
Beachten Sie, dass Sie zuerst alle Daten löschen müssen, deren Wert
name
undage
Wert in den anderen Zeilen gleich ist.Danach sollte es das
ON DUPLICATE
Ereignis auslösen .quelle
In meinem Fall habe ich unten Abfragen erstellt, aber in der ersten Abfrage, wenn
id
1 bereits vorhanden ist und das Alter bereits vorhanden ist, danach, wenn Sie die erste Abfrage ohne erstellen, istage
der Wert vonage
keineUm das oben genannte Problem zu vermeiden, erstellen Sie eine Abfrage wie unten
möge es dir helfen ...
quelle
Falls Sie das alte Feld behalten möchten (z. B. Name). Die Abfrage lautet:
quelle