MySQL(InnoDB):需要删除列,以及相应的外键约束和索引。

10

这是我的表格:

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)
我应该按照什么顺序进行所有操作?我应该使用哪些精确的命令?

你尝试过在同一个ALTER语句中同时删除列和索引吗? - staticsan
3个回答

25

具体来说,请尝试以下操作:

首先删除外键或约束:

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

上一个命令会移除该列的外键约束。现在你可以删除photo_id列(MySQL在删除该列时会移除索引):


ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`;

作为替代方案,你可以将这两个操作合并成一个:

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

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;

如果执行RENAME TABLE时出现错误,可能会有其他表引用了该表的外键约束,这种情况下整个方法都是愚蠢的。 :)

0

尝试将DROP KEY和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`;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接