Я надеюсь, что кто-то может помочь мне с этой проблемой.
У меня есть небольшое приложение, которое «исправляет» нашу БД, поскольку нам нужно расширять функциональность и исправлять ошибки. Он читает в патчах, которые являются просто файлами с инструкциями SQL, и выполняет некоторую внутреннюю служебную работу, запрашивая БД и применяя патчи, которые не были применены. В любом случае, это решение, которое у нас есть, хорошее или плохое, и оно работало довольно хорошо ... до сих пор.
Я посчитал необходимым убрать существующие ограничения внешнего ключа для ряда таблиц и заменить их предложением ON DELETE CASCADE вместо ON DELETE RESTRICT, которое они имеют в настоящее время. Идея состоит в том, что удаление PK в таблице, на которую ссылаются другие таблицы, приведет к очистке всех остальных.
По сути, файл патча содержит следующее:
ALTER TABLE `mydb`.`table2` DROP FOREIGN KEY `fk_table2_id`;
ALTER TABLE `mydb`.`table3` DROP FOREIGN KEY `fk_table3_id`;
ALTER TABLE `mydb`.`table4` DROP FOREIGN KEY `fk_table4_id`;
и связанные
ALTER TABLE `mydb`.`table2` ADD CONSTRAINT `fk_table2_id` FOREIGN KEY `fk_table_id` (`fk_the_id`) REFERENCES `mydb` (`id`)
ON DELETE CASCADE
ON UPDATE RESTRICT;
etc...
На стороне C #, когда я передаю эту строку (операторы SQL, найденные в файле исправлений) следующим образом:
MySqlCommand myCommand = new MySqlCommand(thePatch);
myCommand.Connection = connection;
myCommand.ExecuteNonQuery();
Я получаю следующее сообщение об ошибке:
Ошибка при переименовании '. \ Mydb \ table2' в '. \ Mydb # sql2-6a8-3f' (номер ошибки: 152)
Я получаю это, только когда в строке есть две строки DROP FOREIGN KEY.
Я убедился, что ключи, перечисленные в строках DROP, являются ключами, а не именами столбцов, и все остальное (по крайней мере, мне) выглядит нормально.
Я включил несколько операторов SQL в один MySqlCommand, и у меня не было проблем, поэтому я немного расстроен.
Я могу взять тот же файл и передать его в mysql.exe из командной строки, и он работает нормально, так что похоже на разницу в обработке операторов.
У кого-нибудь есть идеи по этому поводу?
Спасибо,
Matt