我希望有人可以帮我解决这个问题。
我有一个小应用程序来“修补”我们的数据库,因为我们需要增加功能并修复错误。它读取的补丁只是带有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行上列出的键是键而不是列名,其他所有键(至少对我来说)都没问题。
我在一个MySqlCommand中包含了多个SQL语句并且没有任何问题,所以我有点沮丧。
我可以从命令行获取相同的文件并将其传递给mysql.exe,它工作正常,所以它似乎与语句的处理方式不同。
有没有人对此有任何想法?
谢谢, 马特
答案 0 :(得分:0)
我不知道完整的答案,但这可能有助于更深入地解决问题。当您更改表时,MySQL使用以下步骤:
您提到的错误看起来可能是第3步失败了。您可以检查文件权限。除此之外,我将推荐那些对MySQL内部有更多了解的人。