【问题标题】:MySQL Error throw while delete the index of the foreign key.MySQL 删除外键索引时抛出错误。
【发布时间】:2011-10-15 19:28:10
【问题描述】:

我创建了两个参考另一个表的表:

我喜欢这个:

表1:

CREATE TABLE species 
(
  id TINYINT NOT NULL AUTO_INCREMENT, 
  name VARCHAR(50) NOT NULL, 
  PRIMARY KEY(id)
) ENGINE=INNODB;

Table2(上表参考)

CREATE TABLE zoo 
(
  id INT(4) NOT NULL, 
  name VARCHAR(50) NOT NULL,
  FK_species TINYINT(4) NOT NULL, 
  INDEX (FK_species), 
  FOREIGN KEY (FK_species) REFERENCES species (id), 
  PRIMARY KEY(id)
) ENGINE=INNODB;

它会自动为 zoo 表中的 FK_species 的 FOREIGN KEY 创建索引。

现在我尝试删除 zoo 表的索引:

ALTER TABLE zoo DROP INDEX FK_species;

它显示以下 MySQL 错误。

Error on rename of '.\test\#sql-1ec_9d' to '.\test\zoo' (errno: 150)

【问题讨论】:

    标签: mysql indexing foreign-keys


    【解决方案1】:

    来自FOREIGN KEY Constraints @ dev.mysql.com

    InnoDB 支持使用 ALTER TABLE 来删除外键:

    ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

    如果 FOREIGN KEY 子句在您创建时包含 CONSTRAINT 名称 外键,您可以参考该名称来删除外键。 否则,fk_symbol 值由 InnoDB 在内部生成 外键被创建。在需要时找出符号值 要删除外键,请使用 SHOW CREATE TABLE 语句。

    【讨论】:

    • 有趣。这是否意味着您不能在不删除约束的情况下删除索引?
    • 是的,这是我遇到的问题,因为外键自动创建了索引...请告诉我如何创建没有索引的外键。
    • @Manikandan:(来自同一链接):"InnoDB 需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描. 在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会自动在引用表上创建这样的索引。该索引可能会被静默删除稍后,如果您创建另一个可用于强制外键约束的索引。index_name,如果给定,则如前所述使用。"
    • 他们说“如果您创建另一个可用于强制外键约束的索引,此索引可能会在以后被静默删除”。
    【解决方案2】:

    您需要先获取约束名称。

    例子:

    SHOW CREATE TABLE zoo;
    
    -> .... 
       CONSTRAINT `zoo_ibfk_1` FOREIGN KEY (`FK_species`) REFERENCES `species` (`id`)
    

    ...然后...

    ALTER TABLE zoo DROP FOREIGN KEY zoo_ibfk_1;
    

    在此处阅读有关此内容的更多信息: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2014-09-11
      • 2015-06-16
      • 2010-11-01
      • 2012-01-18
      相关资源
      最近更新 更多