10

ここに私のテーブルがあります:

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' への名前変更エラー (errno: 150)

...インデックスを削除しようとすると(上記と同じ)、外部キー制約を削除しようとすると:

エラー 1091 (42000): 'photo_id_refs_id_63282119' を削除できません。列/キーが存在することを確認してください)

これらすべてをどの順序で行う必要がありますか?どの正確なコマンドを使用する必要がありますか?

4

3 に答える 3

25

正確には、これを試してください:

最初に外部キーまたは制約をドロップします。

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

前のコマンドは、列の外部キー制約を削除します。これで、列を削除できますphoto_id(列を削除すると、MySQL によってインデックスが削除されます)。

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`;

または、これら 2 つの操作を 1 つに結合することもできます。

ALTER TABLE `alums_alumphoto` 
   DROP FOREIGN KEY `photo_id_refs_id_63282119` , 
   DROP COLUMN `photo_id`;
于 2008-12-04T14:13:57.440 に答える
7

確かなことは、重複したテーブルを作成することです。

> 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 の実行中にエラーが発生した場合、他のいくつかのテーブルがこのテーブルを参照する外部キー制約を持っている可能性があります。その場合、このアプローチ全体がばかげています。:)

于 2008-12-03T22:42:29.193 に答える