mysqldump с INSERT… ON DUPLICATE


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 преобладают. Кажется, возникает вопрос, как сделать ОБНОВЛЕНИЕ в случае дублирования ключей. В любом случае, я хотел бы знать.
Эдвард Ньюэлл,

@EdwardNewell Обратите внимание, что --replaceэто эквивалентно действию в ON DUPLICATE UPDATEкаждом столбце. К сожалению, mysqldump не предназначен для обновления определенных столбцов из-за массовой загрузки и вывода дампов mysqldump. Мой ответ просто показывает, на что способен mysqldump. Вы должны написать собственный код, кроме mysqldump, чтобы сделать ON DUPLICATE UPDATE.
RolandoMySQLDBA

Пока DB1 и 2 имеют одинаковую схему, вы правы. Но предположим, что в DB1 есть дополнительные поля. Тогда --replace приведет к тому, что дополнительные поля вернутся к значениям по умолчанию (или к ошибке, если нет значений по умолчанию) вместо простого обновления общих полей. Я понимаю , что ситуация в OP является для двух баз данных с теми же схемами, а просто указывает на то , что там есть разница, и было бы полезно иметь истинное обновление типа дампа в некоторых случаях (я обращенную один сейчас!)
Эдвард Ньюэлл

1
Обратите внимание, что если есть внешние ключи, указывающие на обновляемую запись, использование REPLACE INTOможет завершиться неудачей, поскольку запись не может быть удалена с разрывом этих связей. Если да ON DELETE CASCADE, то вы будете очищать те таблицы, которые зависят от обновляемой. REPLACE INTOдовольно опасная операция.
Кристофер Шульц

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