2008-12-03 18 views
10

Voici ma table:MySQL (InnoDB): nécessité de supprimer la colonne, et d'accompagnement contrainte de clé étrangère et l'indice

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 

Je veux supprimer la colonne photo_id, qui vraisemblablement également exiger la suppression de la contrainte de clé étrangère et l'index.

Le problème est que je reçois des erreurs lorsque je tente de supprimer la colonne:

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

... lorsque je tente de supprimer l'index (comme ci-dessus), et lorsque je tente de laisser tomber l'étranger contrainte de clé:

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

Dans quel ordre devrais-je faire tout cela? Quelles commandes précises devrais-je utiliser?

+0

Avez-vous essayé de supprimer à la fois la colonne et l'index dans la même instruction ALTER? – staticsan

Répondre

7

La chose la plus sûre est de créer une table en double.

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

S'il y a une erreur exécution RENAME TABLE, d'autres tableaux pourraient avoir clés étrangères ce tableau, auquel cas cette approche globale est stupide. :)

25

Précisément, essayez ceci:

première goutte ou la clé étrangère Constraint:

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

La commande précédente supprime la contrainte de clé étrangère sur la colonne. Maintenant, vous pouvez déposer la colonne photo_id (l'indice est éliminé par MySQL laissant tomber la colonne):

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`; 

Aternatively, vous pouvez combiner ces 2 opérations en un seul:

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

Essayez de combiner la clé DROP et DROP FOREIGN KEY déclarations.

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