2011-09-03 71 views
4

我有一個InnoDB表claims,它有大約2.4億行。該表具有外鍵約束:CONSTRAINT FK78744BD7307102A9 FOREIGN KEY (ID) REFERENCES claim_details (ID)。我想盡快刪除表claim_detailsmysql drop foreign key without table copy

基於一些實驗,似乎如果我使用SET foreign_key_checks = 0;下降claim_details然後重新啓用外鍵,即使該表不再存在,mysql仍將繼續執行約束。所以,我相信我必須放棄表中的約束。

我試圖使用ALTER TABLE claims DROP FOREIGN KEY FK78744BD7307102A9刪除約束,並且查詢已處於「複製到tmp表」狀態超過24小時(在沒有其他負載的計算機上)。我不明白爲什麼放棄約束需要複製表格。有什麼辦法可以防止這種情況發生?

mysql version 5.1.48。

回答

1

我覺得沒有下降外鍵

http://dev.mysql.com/doc/refman/5.5/en/innodb-create-index-limitations.html

「的MySQL 5.5不支持有效地創建或外鍵約束落下一個好辦法。所以,如果你使用ALTER TABLE來添加或刪除REFERENCES約束,複製子表,而不是使用快速索引創建。「這可能也是指老版本的mysql。

我認爲最好的方法將是從claimsmysqldump轉儲數據,重新創建表沒有外鍵引用到claim_details,萬一有SET foreign_key_checks = 0;禁用重點檢查你有其他的外鍵並導入回數據claims。只記得爲數據和結構單獨轉儲,所以你不需要編輯這個巨大的文件來從表創建語法中刪除外鍵。

+0

我不想刪除索賠表。只有外鍵指向的claim_details表。 – mephillips

+0

確實 - 我的錯誤。我編輯了我的答案。 –

6

從MySQL 5.6開始,MySQL支持就地刪除外鍵/不復制。 Oracle將此稱爲Online DDL

table列出所有在線DDL操作及其運行時行爲。

根據我的經驗,在600GB的桌子上放置外鍵和相應的約束幾乎是瞬間的。有了5.5,它可能需要幾天時間。

我知道的唯一缺點是,5.6不允許你回收表空間。即如果您使用的是innodb_file_per_table,那麼當您刪除索引時,該文件不會縮小。文件中只有未使用的數據會增長。您可以使用SHOW TABLE STATUSData_free列輕鬆檢查。