mysqldump avec INSERT… ON DUPLICATE

21

Je souhaite fusionner des données d'une base de données à une autre. Je crée donc un vidage avec mysqldumppuis l'importe dans une autre base de données (avec la même structure de tables). Je n'ai aucun problème (comme des entrées en double ou autre) dans ce cas.

Mais je fais quelques fusions à des fins de test et je ferai la fusion finale plus tard. Donc, je veux exécuter la fusion (les données peuvent être modifiées) plusieurs fois. Remarquez que mes lignes dans mes tableaux ne sont jamais supprimées, seules peuvent être insérées ou mises à jour.

Puis-je créer mysqldump avec l'option ON DUPLICATE? Ou peut-être puis-je fusionner un vidage qui insère de nouvelles données et mettre à jour des données modifiées?

Bien sûr, je peux insérer ON DUPLICATEdans le vidage manuellement, mais je veux automatiser le processus de fusion.

Xupypr MV
la source

Réponses:

34

Il existe des options pour vous aider:

  --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.

Gardez ce paradigme à l'esprit

  • mysqldump tout de DB1 dans DUMP1
  • charger DUMP1 dans DB3
  • mysqldump tout de DB2 en utilisant --replace (ou --insert-ignore) et --no-create-info dans DUMP2
  • charger DUMP2 dans DB3
RolandoMySQLDBA
la source
1
Attendez une minute: l'utilisation de --replace signifie que les données DB2 écraseront les données DB1 et l'utilisation de --insert-ignore signifie que les données DB1 prévalent. La question semble demander comment faire la MISE À JOUR dans le cas de clés en double. En tout cas, j'aimerais savoir.
Edward Newell
@EdwardNewell Veuillez noter que cela --replaceéquivaut à faire ON DUPLICATE UPDATEsur chaque colonne. Malheureusement, mysqldump n'est pas conçu pour mettre à jour des colonnes spécifiques en raison de la nature du chargement et du vidage en masse de mysqldump. Ma réponse révèle simplement ce que mysqldump est capable de faire. Vous devriez écrire du code personnalisé, à part mysqldump, pour le faire ON DUPLICATE UPDATE.
RolandoMySQLDBA du
Tant que DB1 et 2 ont exactement le même schéma, vous avez raison. Mais supposons que DB1 ait des champs supplémentaires. Ensuite, --replace entraînera le retour des champs supplémentaires aux valeurs par défaut (ou une erreur s'il n'y a pas de valeurs par défaut) au lieu de simplement mettre à jour les champs partagés. Je me rends compte de la situation de l'OP est de deux bases de données avec les mêmes schémas, mais tout en soulignant qu'il y est une différence, et il serait utile d'avoir une vraie décharge mise à jour de type dans certains cas (je suis face à un maintenant!)
Edward Newell
1
Notez que s'il existe des clés étrangères pointant vers l'enregistrement en cours de mise à jour, l'utilisation REPLACE INTOpeut échouer car l'enregistrement ne peut pas être supprimé sans rompre ces relations. Si c'est le cas ON DELETE CASCADE, vous viderez les tables qui dépendent de celle qui est mise à jour. REPLACE INTOest une opération assez dangereuse.
Christopher Schultz
1
@RolandoMySQLDBA D'accord. Je voulais juste commenter pour que quiconque lisant cette réponse comprenne que ces options (en particulier REPLACE INTO) peuvent être dangereuses et avoir des effets "surprenants". Bonne réponse - je voulais juste ajouter une mise en garde.
Christopher Schultz