我希望有人可以帮助我解决这个问题。
我有一个小应用程序来“修补”我们的数据库,因为我们需要增强功能并修复错误。它读取只是带有 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,它工作正常,因此在处理语句的方式上似乎有所不同。
有人对此有任何想法吗?
谢谢,马特