MySQL (InnoDB): необходимо удалить столбец и сопровождающее ограничение внешнего ключа и индекс - PullRequest
10 голосов
/ 04 декабря 2008

Вот мой стол:

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)

В каком порядке я должен делать все это? Какие точные команды я должен использовать?

Ответы [ 3 ]

25 голосов
/ 04 декабря 2008

Точно, попробуйте это:

Сначала сбросьте внешний ключ или ограничение:

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

Предыдущая команда удаляет ограничение внешнего ключа в столбце. Теперь вы можете удалить столбец photo_id (индекс удаляется MySQL при удалении столбца):

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`;

В качестве альтернативы, вы можете объединить эти 2 операции в одну:

ALTER TABLE `alums_alumphoto` 
   DROP FOREIGN KEY `photo_id_refs_id_63282119` , 
   DROP COLUMN `photo_id`;
7 голосов
/ 04 декабря 2008

Обязательно сделайте копию таблицы.

> 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 голосов
/ 17 декабря 2008

Попробуйте объединить операторы 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`;
...