MySQL的(InnoDB的):需要删除列,以及伴随外键约束和索引
-
19-08-2019 - |
题
下面是我的表:
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)
什么顺序我做这一切的?我应该使用什么确切命令?
解决方案
在确定的事情就是让一个重复表。
> 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;
如果有执行重命名表的错误,一些其他表可能会引用此表的,在这种情况下这整个的做法是愚蠢的外键约束。 :)
其他提示
准确地说,尝试:
首先删除外键约束或:
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`;
尝试组合DROP KEY和DROP外键语句。
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`;
不隶属于 StackOverflow