C # MySqlCommand Проблема множественного удаления внешнего ключа - PullRequest
0 голосов
/ 31 декабря 2008

Я надеюсь, что кто-то может помочь мне с этой проблемой.

У меня есть небольшое приложение, которое «исправляет» нашу БД, поскольку нам нужно расширять функциональность и исправлять ошибки. Он читает в патчах, которые являются просто файлами с инструкциями 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

1 Ответ

0 голосов
/ 19 марта 2009

Я не знаю полного ответа, но это может помочь в устранении неполадок немного глубже. При изменении таблицы MySQL использует следующие шаги:

  1. CREATE TABLE newTableName с новыми спецификациями
  2. SELECT * FROM oldTableName INTO newTableName
  3. Переименуйте oldTableName в какое-нибудь промежуточное_Таблица
  4. переименовать newTableName в OldTableName
  5. DROP TABLE middleTableName

Ошибка, о которой вы упомянули, выглядит так, как будто это может быть ошибкой шага 3 здесь. Вы можете проверить права доступа к файлам. Помимо этого, я буду полагаться на тех, кто обладает большими знаниями о внутренностях MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...