2012-08-08 61 views
2

我想從一個表中也有一個外鍵刪除一個多列唯一鍵。我不斷收到'errno 150',除非我先刪除外鍵。刪除多列唯一鍵而不丟棄外鍵?

例如,如果我創建表:

CREATE TABLE `testtable` (
    `testtable_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `testtable_value` char(255) DEFAULT NULL, 
    `othertable_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`testtable_id`), 
    UNIQUE KEY `tt_unique_key` (`othertable_id`,`testtable_value`), 
    CONSTRAINT `tt_foreign_key` FOREIGN KEY (`othertable_id`) REFERENCES `othertable` (`othertable_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

,我嘗試刪除這樣的唯一關鍵:

ALTER TABLE `testtable` DROP KEY `tt_unique_key`; 

它產生錯誤:

Error Code: 1025 
Error on rename of './testdb/#sql-374_27' to './testdb/testtable' (errno: 150) 

我嘗試設置FOREIGN_KEY_CHECKS = 0,但我得到了相同的錯誤:

SET FOREIGN_KEY_CHECKS = 0; 
ALTER TABLE `testtable` DROP KEY `tt_unique_key`; 
SET FOREIGN_KEY_CHECKS = 1; 

這會生成與上面相同的錯誤消息。

但是,如果我先刪除外鍵,然後刪除唯一的密鑰,然後重新創建外鍵,一切正常:

ALTER TABLE `testtable` DROP FOREIGN KEY `tt_foreign_key`; 
ALTER TABLE `testtable` DROP KEY `tt_unique_key`; 
ALTER TABLE `testtable` ADD CONSTRAINT `tt_foreign_key` FOREIGN KEY (`othertable_id`) REFERENCES `othertable` (`othertable_id`); 

這似乎真的效率低下。任何人都可以解釋發生了什麼?有沒有辦法在不丟棄外鍵的情況下刪除唯一密鑰?

+0

你嘗試對列添加普通索引,然後刪除唯一一個? – Sebas 2012-08-08 02:11:24

回答

1

外鍵引用,需要一個鍵,
可以使用的唯一關鍵是t_unique_key, 這就是爲什麼你不能刪除它。
所以先添加另一個匹配的密鑰,然後刪除舊鑰匙,你的情況othertable_id場

ALTER TABLE `testtable` 
ADD KEY (othertable_id), 
DROP KEY `tt_unique_key`;