Помогите мне сохранить мою базу данных - PullRequest
1 голос
/ 28 февраля 2011

Я недавно перенес свою базу данных на другой сервер.

На старом сервере я интенсивно использовал правила ON DELETE CASCADE InnoDB.

На новом сервере MySql не имелНастройка движка InnoDB.

Во время миграции новый сервер по умолчанию был установлен на MyISAM - и я не замечал этого до сих пор.(Стук головой об стену!)

Итак, вот ситуация: поскольку база данных уже использовалась, некоторые из моих таблиц, которые использовали правило ON DELETE CASCADE, теперь не синхронизированы.(Все еще стучит головой об стену.)

Это означает, что я не могу просто изменить таблицы на InnoDB и повторно применить правила каскада - некоторые ключи теперь ссылаются на строки, которые больше не существуют.

Мой вопрос таков:

Есть ли способ настроить оператор INSERT так, чтобы, если какая-либо из вставляемых строк нарушала правило каскада, он просто молча игнорировал эту строку и переходил к следующей?(Сначала я думал, что INSERT IGNORE справится с этой задачей, но я попробовал это, и, похоже, это не сработало.)

Заранее спасибо за вашу помощь

1 Ответ

0 голосов
/ 15 апреля 2011

ШАГ 1

Сделать резервную копию

ШАГ 2

SET foreign_key_checks = 0;

Migrate your data

SET foreign_key_checks = 1;

ШАГ 3

DELETE FROM table WHERE id NOT IN (SELECT foreign_key_id FROM table2);

Там, где операторы удаления соответствуют вашим ON DELETE CASCADE правилам.
Помните, что порядок, в котором вы делаете свои удаления, важен, поэтому планируйте и делайте дополнительные резервные копии по пути, если это будет необходимо.

Как только вы закончите резервное копирование еще раз, отредактируйте резервную копию SQL-оператора так, чтобы строки SET foreign_key_checks = x были , а не .Если ваша резервная копия с проверками внешнего ключа включена работает, вы снова в деле.

Я уверен, что вы сможете найти более эффективные запросы на удаление без IN, простомои 2 цента

...