mysqldump con INSERT ... ON DUPLICATE


21

Voglio unire i dati da un database all'altro. Quindi creo il dump con mysqldumpe quindi lo importazione in un altro database (con la stessa struttura delle tabelle). Non ho problemi (come voci duplicate o qualcos'altro) in questo caso.

Ma faccio alcune fusioni a scopo di test e farò la fusione finale in seguito. Quindi, voglio eseguire l'unione (i dati possono essere modificati) alcune volte. Nota, le mie righe nelle mie tabelle non vengono mai eliminate, solo possono essere inserite o aggiornate.

Posso creare mysqldump con l'opzione ON DUPLICATE? Oppure posso unire il dump che inserisce nuovi dati e aggiorna i dati modificati?

Certo, posso inserire ON DUPLICATEmanualmente nel dump, ma voglio automatizzare il processo di unione.

Risposte:


34

Ci sono opzioni per aiutarti in questo:

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

Tieni presente questo paradigma

  • mysqldump tutto da DB1 a DUMP1
  • caricare DUMP1 in DB3
  • mysqldump tutto da DB2 usando --replace (o --insert-ignore) e --no-create-info in DUMP2
  • caricare DUMP2 in DB3

1
Aspetta un minuto: l'uso di --replace significa che i dati DB2 sovrascriveranno i dati DB1 e l'uso di --insert-ignore significa che prevalgono i dati DB1. La domanda sembra porsi come fare AGGIORNAMENTO nel caso di chiavi duplicate. In ogni caso, mi piacerebbe saperlo.
Edward Newell,

@EdwardNewell Nota che --replaceequivale a fare ON DUPLICATE UPDATEsu ogni colonna. Sfortunatamente, mysqldump non è progettato per aggiornare colonne specifiche a causa della natura di caricamento e scaricamento in blocco di mysqldump. La mia risposta rivela semplicemente ciò che mysqldump è in grado di fare. Dovresti scrivere un codice personalizzato, oltre a mysqldump, per farlo ON DUPLICATE UPDATE.
RolandoMySQLDBA,

Finché DB1 e 2 hanno esattamente lo stesso schema, hai ragione. Supponiamo che DB1 abbia campi extra. Quindi --replace farà ritornare i campi extra ai valori predefiniti (o un errore se non ci sono valori predefiniti) invece di aggiornare semplicemente i campi condivisi. Mi rendo conto che la situazione del PO è per due database con gli stessi schemi, ma solo sottolineare che non v'è una differenza, e sarebbe utile avere un vero e proprio aggiornamento di tipo discarica, in alcuni casi (sto affrontando uno ora!)
Edward Newell,

1
Si noti che se ci sono chiavi esterne che puntano al record da aggiornare, l'utilizzo REPLACE INTOpotrebbe non riuscire perché il record non può essere eliminato con l'interruzione di tali relazioni. Se lo hai ON DELETE CASCADE, svuoterai quelle tabelle che dipendono da quella che viene aggiornata. REPLACE INTOè un'operazione piuttosto pericolosa.
Christopher Schultz,

1
@RolandoMySQLDBA Concordato. Volevo solo commentare in modo che chiunque leggesse questa risposta comprendesse che queste opzioni (in particolare REPLACE INTO) possono essere pericolose e avere effetti "sorprendenti". Buona risposta - volevo solo aggiungere un avvertimento.
Christopher Schultz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.