mysqldump mit INSERT… ON DUPLICATE


21

Ich möchte Daten aus einer Datenbank in eine andere zusammenführen. Also erstelle ich einen Dump mit mysqldumpund importiere ihn dann in eine andere Datenbank (mit der gleichen Tabellenstruktur). Ich habe in diesem Fall keine Probleme (wie doppelte Einträge oder etwas anderes).

Aber ich führe einige Zusammenführungen zu Testzwecken durch und werde sie später endgültig zusammenführen. Daher möchte ich die Zusammenführung einige Male ausführen (Daten können geändert werden). Beachten Sie, dass meine Zeilen in meinen Tabellen niemals gelöscht werden, sondern nur eingefügt oder aktualisiert werden können.

Kann ich mysqldump mit der Option ON DUPLICATE erstellen? Oder kann ich einen Dump zusammenführen, der neue Daten einfügt und geänderte Daten aktualisiert?

Sicher, ich kann ON DUPLICATEmanuell in Dump einfügen , aber ich möchte den Zusammenführungsprozess automatisieren.

Antworten:


34

Hierfür gibt es verschiedene Möglichkeiten:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

Behalte dieses Paradigma im Hinterkopf

  • mysqldump alles von DB1 in DUMP1
  • Laden Sie DUMP1 in DB3
  • mysqldump alles von DB2 mit --replace (oder --insert-ignore) und --no-create-info in DUMP2
  • Laden Sie DUMP2 in DB3

1
Warten Sie eine Minute: Die Verwendung von --replace bedeutet, dass DB2-Daten DB1-Daten überschreiben, und die Verwendung von --insert-ignore bedeutet, dass DB1-Daten Vorrang haben. Die Frage scheint zu fragen, wie UPDATE bei doppelten Schlüsseln durchgeführt werden soll. Ich würde es auf jeden Fall gerne wissen.
Edward Newell

@EdwardNewell Bitte beachten Sie, dass --replacedies ON DUPLICATE UPDATEfür jede Spalte gleichbedeutend ist . Leider ist mysqldump nicht dafür ausgelegt, bestimmte Spalten zu aktualisieren, da mysqldump Massenlade- und Speicherauszüge ausführt. Meine Antwort zeigt einfach, wozu mysqldump in der Lage ist. Dazu müssten Sie, abgesehen von mysqldump, benutzerdefinierten Code schreiben ON DUPLICATE UPDATE.
RolandoMySQLDBA

Solange DB1 und 2 genau dasselbe Schema haben, haben Sie Recht. Angenommen, DB1 verfügt über zusätzliche Felder. Dann bewirkt --replace, dass die zusätzlichen Felder auf die Standardeinstellungen zurückgesetzt werden (oder ein Fehler, wenn keine Standardeinstellungen vorhanden sind), anstatt nur die freigegebenen Felder zu aktualisieren. Ich stellt fest , die OP Situation für zwei Datenbanken mit denselben Schemata, sondern nur darauf hingewiesen , dass es ist ein Unterschied, und es wäre sinnvoll , einen echten Update-Typ - Dump in bestimmten Fällen zu haben (ich eine jetzt bin vor!)
Edward Newell

1
Beachten Sie, dass die Verwendung von REPLACE INTOmöglicherweise fehlschlägt , wenn Fremdschlüssel auf den zu aktualisierenden Datensatz verweisen, da der Datensatz nicht gelöscht werden kann, wenn diese Beziehungen getrennt werden. Wenn dies der Fall ist ON DELETE CASCADE, werden die Tabellen, die von der zu aktualisierenden Tabelle abhängen, ausgeblendet. REPLACE INTOist eine ziemlich gefährliche Operation.
Christopher Schultz

1
@RolandoMySQLDBA Einverstanden. Ich wollte nur kommentieren, damit jeder, der diese Antwort liest, versteht, dass diese Optionen (besonders REPLACE INTO) gefährlich sein und "überraschende" Effekte haben können. Gute Antwort - wollte nur eine Einschränkung hinzufügen.
Christopher Schultz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.