C#MySqlCommand多个Drop外键问题

时间:2008-12-31 14:17:18

标签: c# mysql foreign-keys

我希望有人可以帮我解决这个问题。

我有一个小应用程序来“修补”我们的数据库,因为我们需要增加功能并修复错误。它读取的补丁只是带有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,它工作正常,所以它似乎与语句的处理方式不同。

有没有人对此有任何想法?

谢谢, 马特

1 个答案:

答案 0 :(得分:0)

我不知道完整的答案,但这可能有助于更深入地解决问题。当您更改表时,MySQL使用以下步骤:

  1. 使用新规范创建表newTableName
  2. SELECT * FROM oldTableName INTO newTableName
  3. 将oldTableName重命名为某个intermediateTableName
  4. 将newTableName重命名为OldTableName
  5. DROP TABLE intermediateTableName
  6. 您提到的错误看起来可能是第3步失败了。您可以检查文件权限。除此之外,我将推荐那些对MySQL内部有更多了解的人。