0

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

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

有人对此有任何想法吗?

谢谢,马特

4

1 回答 1

0

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

  1. 使用新规范创建表 newTableName
  2. SELECT * FROM oldTableName INTO newTableName
  3. 将 oldTableName 重命名为一些 middleTableName
  4. 将 newTableName 重命名为 OldTableName
  5. DROP TABLE 中间表名

您提到的错误看起来可能在此处的第 3 步失败。您可以检查文件权限。除此之外,我将听从那些对 MySQL 内部结构有更深入了解的人。

于 2009-03-19T17:44:04.810 回答