誰かがこの問題で私を助けてくれることを願っています。
機能を強化してバグを修正する必要があるため、DB に「パッチ」を適用するための小さなアプリがあります。SQL ステートメントを含む単なるファイルであるパッチを読み取り、DB にクエリを実行して、適用されていないパッチを適用する内部ハウスキーピングを行います。とにかく、これは良いか悪いかにかかわらず、私たちが持っている解決策であり、かなりうまく機能しています...今まで.
多くのテーブルで既存の外部キー制約を削除し、現在の ON DELETE RESTRICT の代わりに ON DELETE CASCADE 句に置き換える必要があることがわかりました。これらの他のテーブルが参照するテーブルの 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' への名前変更エラー (errno: 152)
文字列にこれらの DROP FOREIGN KEY 行が 2 つある場合にのみ、これを取得します。
DROP 行にリストされているキーが列名ではなくキーであることを確認しました。他のすべては (少なくとも私には) 問題ないように見えます。
単一の MySqlCommand に複数の SQL ステートメントを含めましたが、問題はなかったので、少しイライラしています。
同じファイルを取得して、コマンド ラインから mysql.exe にパイプすることができ、正常に動作するため、ステートメントの処理方法が異なるようです。
誰かがこれについて何か考えを持っていますか?
ありがとう、マット