mysqldump з INSERT… НА ДУПЛІКАТ


21

Я хочу об'єднати дані з однієї бази даних в іншу. Тож я створюю дамп із mysqldumpі потім імпортую його до іншої бази даних (з такою ж структурою таблиць). У мене немає жодних проблем (наприклад, дублікатів або чогось іншого) у цьому випадку.

Але я роблю деякі злиття для тестових цілей, і остаточне злиття виконую пізніше. Отже, я хочу виконати злиття (дані можуть бути змінені) кілька разів. Зауважте, мої рядки в моїх таблицях ніколи не видаляються, лише можна вставляти або оновлювати.

Чи можна створити mysqldump за допомогою параметра ON DUPLICATE? Або я можу злити дамп, який вставляє нові дані та оновлює змінені дані?

Звичайно, я можу вставити ON DUPLICATEв дамп вручну, але я хочу автоматизувати процес злиття.

Відповіді:


34

Є варіанти, які допоможуть вам у цьому:

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

Пам'ятайте про цю парадигму

  • mysqldump все з DB1 в DUMP1
  • завантажте DUMP1 у DB3
  • mysqldump все з DB2, використовуючи --replace (або --insert-ignore) та --no-create-info в DUMP2
  • завантажте DUMP2 в DB3

1
Зачекайте хвилину: використання --replace означає, що дані DB2 замінять дані DB1, а використання --insert-ignore означає, що дані DB1 переважають. Здається, питання запитує, як зробити UPDATE у випадку дублювання ключів. У будь-якому випадку, я хотів би знати.
Едвард Ньюелл

@EdwardNewell Зверніть увагу, що --replaceце рівнозначно виконанню ON DUPLICATE UPDATEв кожному стовпчику. На жаль, mysqldump не призначений для оновлення конкретних стовпців через об'ємного завантаження та демпінгового характеру mysqldump. Моя відповідь просто розкриває, на що здатний mysqldump. Вам потрібно буде написати спеціальний код, крім mysqldump, щоб зробити ON DUPLICATE UPDATE.
RolandoMySQLDBA

Поки DB1 і 2 мають абсолютно однакову схему, ви праві. Але припустимо, DB1 має додаткові поля. Тоді --replace призведе до повернення додаткових полів до значень за замовчуванням (або помилка, якщо немає за замовчуванням), а не просто оновлення спільних полів. Я усвідомлюю, що ситуація з ОП складається з двох баз даних з однаковими схемами, але просто зазначаючи, що є різниця, і було б корисно мати справжній дамп оновлення типу оновлення в певних випадках (я зараз стикаюся з ним!)
Edward Newell

1
Зауважте, що якщо є зовнішні ключі, що вказують на оновлення запису, використання REPLACE INTOможе бути невдалим, оскільки запис неможливо видалити при розриві цих зв’язків. Якщо у вас є ON DELETE CASCADE, ви очистите ті таблиці, які залежать від оновленої. REPLACE INTO- досить небезпечна операція.
Крістофер Шульц

1
@RolandoMySQLDBA Погодився. Я просто хотів прокоментувати, щоб кожен, хто читав цю відповідь, зрозумів, що ці варіанти (зокрема REPLACE INTO) можуть бути небезпечними та мати "дивовижні" наслідки. Гарна відповідь - просто хотів додати застереження.
Крістофер Шульц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.