这是我的 table :

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列,大概还需要删除外键约束和索引。

问题是,当我尝试删除列时出现错误:

错误1025(HY000):将'。\dbname\#sql-670_c5c'重命名为'。\dbname\alums_alumphoto'时出错(错误号:150)

...当我尝试删除索引(与上面相同)时,以及当我尝试删除外键约束时:

错误1091(42000):无法删除'photo_id_refs_id_63282119';检查列/键是否存在)

我应该按照什么顺序进行所有这些操作?我应该使用什么精确命令?

最佳答案

确定的事情是制作一个重复的表。

> 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时出错,则某些其他表可能具有引用该表的外键约束,在这种情况下,整个方法都是愚蠢的。 :)

关于MySQL(InnoDB): need to delete column,及其附带的外键约束和索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/338978/

10-09 05:04