2008-12-03 39 views
10

這裏是我的表:的MySQL(InnoDB的):需要刪除列,以及伴隨外鍵約束和索引

CREATE TABLE `alums_alumphoto` ( 
    `id` int(11) NOT NULL auto_increment, 
    `alum_id` int(11) NOT NULL, 
    `photo_id` int(11) default NULL, 
    `media_id` int(11) default NULL, 
    `updated` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `alums_alumphoto_alum_id` (`alum_id`), 
    KEY `alums_alumphoto_photo_id` (`photo_id`), 
    KEY `alums_alumphoto_media_id` (`media_id`), 
    CONSTRAINT `alums_alumphoto_ibfk_1` FOREIGN KEY (`media_id`) REFERENCES `media_mediaitem` (`id`), 
    CONSTRAINT `alum_id_refs_id_706915ea` FOREIGN KEY (`alum_id`) REFERENCES `alums_alum` (`id`), 
    CONSTRAINT `photo_id_refs_id_63282119` FOREIGN KEY (`photo_id`) REFERENCES `media_mediaitem` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8 

我想刪除列photo_id,這大概還需要刪除外鍵約束,該指數。

的問題是,我得到的錯誤,當我嘗試刪除列:

ERROR 1025 (HY000): Error on rename of '.\dbname\#sql-670_c5c' to '.\dbname\alums_alumphoto' (errno: 150)

...當我嘗試刪除索引(同上),當我嘗試刪除外關鍵約束:

ERROR 1091 (42000): Can't DROP 'photo_id_refs_id_63282119'; check that column/key exists)

什麼順序我應該做的所有這一切?我應該使用哪些精確的命令?

+0

您是否嘗試過在同一個ALTER語句中刪除列和索引? – staticsan 2008-12-03 23:30:24

回答

7

確定的是做一個重複的表。

> CREATE TABLE alums_alumphoto_new LIKE alums_alumphoto; 
> ALTER TABLE .... // Drop constraint 
> ALTER TABLE .... // Drop KEY 
> ALTER TABLE .... // Drop the column 
> INSERT INTO alums_alumphoto_new (SELECT id, alum_id, photo_id, media_id, updated FROM alums_alumphoto); 
> RENAME TABLE alums_alumphoto TO alums_alumphoto_old, alums_alumphoto_new TO alums_alumphoto; 

如果有執行重命名錶的錯誤,一些其他表可能會引用此表的,在這種情況下這整個的做法是愚蠢的外鍵約束。 :)

25

準確地說,試試這個:

首次下降外鍵或約束:

ALTER TABLE `alums_alumphoto` DROP FOREIGN KEY `photo_id_refs_id_63282119`; 

上面的命令刪除外鍵約束在列。現在,您可以放置​​列photo_id(該指數是由MySQL取消了刪除列):

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`; 

Aternatively,你可以將這些2個操作合併到一個:

ALTER TABLE `alums_alumphoto` 
    DROP FOREIGN KEY `photo_id_refs_id_63282119` , 
    DROP COLUMN `photo_id`; 
0

嘗試結合掛斷鍵和DROP FOREIGN KEY語句。

ALTER TABLE `alums_alumphoto` 
    DROP KEY KEY `alums_alumphoto_photo_id`, 
    DROP FOREIGN KEY `photo_id_refs_id_63282119`; 

ALTER TABLE `alums_alumphoto` 
    DROP COLUMN `photo_id`;