2008-12-03 37 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`;