0

誰かがこの問題で私を助けてくれることを願っています。

機能を強化してバグを修正する必要があるため、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 にパイプすることができ、正常に動作するため、ステートメントの処理方法が異なるようです。

誰かがこれについて何か考えを持っていますか?

ありがとう、マット

4

1 に答える 1

0

完全な答えはわかりませんが、これはもう少し深いトラブルシューティングに役立つかもしれません。テーブルを変更する場合、MySQL は次の手順を使用します。

  1. 新しい仕様で CREATE TABLE newTableName
  2. SELECT * FROM oldTableName INTO newTableName
  3. oldTableName の名前を中間の TableName に変更します
  4. newTableName を OldTableName に名前変更
  5. DROP TABLE 中間テーブル名

あなたが言及したエラーは、ここでステップ3に失敗しているようです。ファイルのアクセス許可を確認してください。それ以上は、MySQL の内部についての知識が豊富な人に任せます。

于 2009-03-19T17:44:04.810 に答える