2008-12-31 99 views
0

我希望有人能幫助我解決這個問題。C#MySqlCommand多重丟棄外鍵問題

我有一個小應用程序來修補我們的數據庫,因爲我們需要增加功能並修復錯誤。它讀入的補丁只是包含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的\表2' 。以(錯誤:152)' \ MYDB#sql2-6a8-3f。」

當我有兩個的這些,我只得到這個刪除字符串中的FOREIGN KEY行。

我已經確定DROP行上列出的鍵是鍵而不是列名,其他所有內容都出現(對我來說至少)是可以的。

我已經在單個MySqlCommand中包含多個SQL語句,並沒有問題,所以我有點沮喪。

我可以採取相同的文件,並從命令行管道它到mysql.exe,它工作正常,所以它似乎在如何處理語句的差異。

有沒有人對此有任何意見?

謝謝, 馬特

回答

0

我不知道完整的答案,但是這可能會幫助解決得更深一些。當您更改表MySQL使用以下步驟: 1)CREATE TABLE newTableName與新規格 2)SELECT * FROM oldTableName INTO newTableName 3)重命名oldTableName一些intermediateTableName 4)重命名newTableName到OldTableName 5)DROP TABLE intermediateTableName

您提到的錯誤看起來可能會失敗步驟3。您可能會檢查文件權限。除此之外,我會推遲那些對MySQL內部知識更瞭解的人。