2010-09-11 5 views
8

Ich habe zwei INSERT Befehle, die für mich so nutzlos sind, weil die zwei Sätze von Zeilen - die, die bereits in der Tabelle sind, und diejenigen, die ich als INSERT Befehle habe - sind nicht disjunkt. Beide Befehle fügen viele Zeilen und viele Werte ein.Konvertieren von INSERT-Befehle in UPDATE

Daher bekomme ich den doppelten Eintrag Fehler, wenn ich diese Zeilen ausführen möchten.

Gibt es eine einfache Möglichkeit, diese Befehle in UPDATE umzuwandeln?

Ich weiß, das klingt dumm, denn warum mache ich INSERT Befehle, wenn ich UPDATE will. Nur um es ein klares Szenario zu machen: ein anderer Entwickler gab mir das Skript :)

Vielen Dank im Voraus, Daniel

EDIT - Problem

Erste gelöst habe ich einen Tisch und füllte es mit meine INSERT Befehle, dann habe ich den folgenden Befehl REPLACE:

REPLACE 
    INTO table_1 
SELECT * 
    FROM table_2; 

Dies kann ursprünglich unter: How can I merge two MySQL tables?

+2

Welche SQL? Einige Varianten (zum Beispiel MSSQL) unterstützen die MERGE-Anweisung, die definitiv auf Ihrer Straße wäre. Bitte aktualisieren Sie Ihre Tags. – spender

+0

Vielen Dank für Ihre Nachricht. Wir sprechen über MySQL-Abfragen. –

Antwort

13

MySQL-Schlüssel REPLACE tut dies. Ersetzen Sie einfach das INSERT Schlüsselwort in Ihren Abfragen durch das Wort REPLACE und es sollte die Zeilen aktualisieren, statt neue einzufügen. Bitte beachten Sie, dass dies nur funktioniert, wenn Sie einen Primärschlüssel oder eine eindeutige Schlüsselspalte einfügen.

+1

Danke! Ich werde eine Bearbeitung vornehmen, um meine Lösung detailliert zu erklären. –

+1

Dies kann zu Problemen führen. Durch Ersetzen wird die Zeile mit dem doppelten Schlüssel gelöscht und die gesamte neue Zeile geschrieben. Dies kann Ihre Indizes durcheinanderbringen und zusätzlichen Aufwand verursachen. Es ist zweckmäßiger, 'auf Duplikat ... Update' zu verwenden, das Ihre Indizes behält. Ersetzen wird besser in einmaligen Szenarios verwendet, in denen Sie eine Neuindizierung durchführen möchten, anstatt auf wiederholte Abfragen zum Aktualisieren einer Tabelle. –

0

Sie müssten sie von Hand in Updates umschreiben. Wenn ich auf ein solches Problem stoße, frage ich zuerst nach der Anzahl bestimmter Primärschlüssel, wenn keine gefunden werden, füge ich einen generischen Datensatz ein und aktualisiere ihn danach. Dadurch können neue Daten hinzugefügt und bereits vorhandene Daten aktualisiert werden, und Sie müssen nicht zwischen dem Einfügen neuer Daten und dem Aktualisieren von Daten unterscheiden.

0

Für MySQL können Sie entweder die INSERT IGNORE oder die INSERT ... ON DUPLICATE UPDATE Syntax verwenden. Siehe das MySQL reference manual

0

Sie können Ihre Anfragen leicht ändern doppelte Zeilen zu aktualisieren, siehe INSERT ... ON DUPLICATE KEY Syntax in MySQL

+0

Ich habe über die ON DUPLICATE KEY Lösung nachgedacht, aber ich sehe nicht, wie es einfach wäre. –