1167 Stimmen

Einfügen in eine MySQL-Tabelle oder Aktualisieren, falls vorhanden

Ich möchte eine Zeile zu einer Datenbanktabelle hinzufügen, aber wenn eine Zeile mit demselben eindeutigen Schlüssel vorhanden ist, möchte ich die Zeile aktualisieren.

Zum Beispiel:

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);

Nehmen wir an, der eindeutige Schlüssel lautet ID und in meinem Datenbank gibt es eine Zeile mit ID = 1 . In diesem Fall möchte ich diese Zeile mit diesen Werten aktualisieren. Normalerweise führt dies zu einem Fehler.
Wenn ich die INSERT IGNORE wird der Fehler ignoriert, aber es wird trotzdem nicht aktualisiert.

25voto

Luis Reyes Punkte 378

Probieren Sie es aus:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

Ich hoffe, das hilft.

22voto

Rich Punkte 3555

Für den Fall, dass Sie eine non-primary Felder als Kriterien/Bedingung für ON DUPLICATE können Sie eine UNIQUE INDEX Schlüssel in dieser Tabelle, um die DUPLICATE .

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);

Und falls Sie zwei Felder kombinieren möchten, um sie in der Tabelle eindeutig zu machen, können Sie dies durch Hinzufügen weiterer Parameter erreichen.

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);

Stellen Sie sicher, dass Sie zuerst alle Daten löschen, die denselben name et age Wert in den anderen Zeilen.

DELETE table FROM table AS a, table AS b WHERE a.id < b.id 
AND a.name <=> b.name AND a.age <=> b.age;

Danach sollte es die ON DUPLICATE Veranstaltung.

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name = VALUES(name), age = VALUES(age)

17voto

SteveCinq Punkte 1794

Gerade weil ich hier auf der Suche nach dieser Lösung war, aber für die Aktualisierung von einer anderen identisch strukturierten Tabelle (in meinem Fall Website-Test-DB zu Live-DB):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

Wie bereits an anderer Stelle erwähnt, müssen nur die Spalten, die Sie aktualisieren wollen, nach ON DUPLICATE KEY UPDATE .

Es ist nicht notwendig, die Spalten in der Datei INSERT ou SELECT obwohl ich zustimme, dass dies wahrscheinlich die bessere Praxis ist.

16voto

DawnSong Punkte 3836

Bei Verwendung von SQLite:

REPLACE into table (id, name, age) values(1, "A", 19)

Vorausgesetzt, dass id ist der Primärschlüssel. Andernfalls wird einfach eine weitere Zeile eingefügt. Siehe _INSERT_ (SQLite).

6voto

Xman Classical Punkte 4791

Falls Sie das alte Feld beibehalten wollen (z. B. Name). Die Abfrage lautet dann:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name=name, age=19;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X