2008-12-03 13 views
10

Oto mój stół:MySQL (InnoDB): trzeba usunąć kolumnę i towarzyszących ograniczenie klucza obcego i indeks

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 

Chcę usunąć kolumnę photo_id, która przypuszczalnie będzie również wymagać usunięcie klucza obcego i indeks.

Problemem jest to, że pojawiają się błędy podczas próby upuść kolumny:

ERROR 1025 (HY000): Error on rename of '.\dbname\#sql-670_c5c' to '.\dbname\alums_alumphoto' (errno: 150)

... gdy próbuję spadek indeksu (jak wyżej), a gdy próbuję upuść zagranicznych klucz ograniczenia:

ERROR 1091 (42000): Can't DROP 'photo_id_refs_id_63282119'; check that column/key exists)

Jakiej kolejności powinienem to wszystko robić? Jakich precyzyjnych poleceń powinienem używać?

+0

Próbowałeś upuścić kolumnę i indeks w tym samym wyciągu ALTER? – staticsan

Odpowiedz

7

Na pewno trzeba zrobić duplikat tabeli.

> 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; 

Jeśli wystąpi błąd wykonywania RENAME TABLE, niektóre inne tabele może mieć klucz obcy ograniczeń odwołujące się do tej tabeli, w którym to przypadku całe podejście jest głupie. :)

25

Dokładnie, spróbuj tego:

Najpierw upuść klucz obcy lub Wiązanie:

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

Poprzednie polecenie usuwa klucz obcy ograniczenie na kolumnie. Teraz można upuścić kolumnę photo_id (indeks jest usuwany przez MySQL na upuszczenie kolumny):

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`; 

Aternatively, można połączyć te 2 operacje w jednym:

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

Spróbuj łącząc KEY DROP i ZWROT OBCYCH instrukcji.

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`;