【问题标题】:MySQL (InnoDB): need to delete column, and accompanying foreign key constraint and indexMySQL(InnoDB):需要删除列,以及伴随的外键约束和索引
【发布时间】:2008-12-03 22:25:05
【问题描述】:

这是我的桌子:

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): 将 '.\dbname\#sql-670_c5c' 重命名为 '.\dbname\alums_alumphoto' 时出错(错误号:150)

...当我尝试删除索引时(同上),以及当我尝试删除外键约束时:

ERROR 1091 (42000): Can't DROP 'photo_id_refs_id_63282119';检查列/键是否存在)

我应该按照什么顺序进行所有这些操作?我应该使用哪些精确的命令?

【问题讨论】:

  • 您是否尝试在同一个 ALTER 语句中同时删除列和索引?

标签: mysql innodb mysql-error-1025 mysql-error-1091


【解决方案1】:

没错,试试这个:

首先删除外键或约束:

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

前面的命令删除列上的外键约束。现在您可以删除列 photo_id(删除列时 MySQL 删除了索引):

ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`;

或者,您可以将这两个操作合二为一:

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

【讨论】:

    【解决方案2】:

    肯定是做一个重复的表。

    > 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 时出错,其他一些表可能具有引用该表的外键约束,在这种情况下,整个方法是愚蠢的。 :)

    【讨论】:

      【解决方案3】:

      尝试结合使用 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`;
      

      【讨论】:

        猜你喜欢
        • 2010-12-15
        • 2012-01-18
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 2010-12-07
        • 2014-06-23
        相关资源
        最近更新 更多