无法删除外键。

27

我想删除我的表中的外键,但是遇到了以下错误消息

mysql> alter table customers drop foreign key customerid;
ERROR 1025 (HY000): Error on rename of '.\products\customers' to '.\products\#sql2-7ec-a3' (errno: 152)
mysql>

1
这可能会帮助您理解: https://dev59.com/BnVC5IYBdhLWcg3w21Mq - Imdad
1
@Imdad 这个链接描述了另一个错误 - (errno: 150)。 - Devart
试试这个。创建一个新表(不带外键约束)。将数据复制到新表中(使用语法INSERT INTO new_table SELECT * FROM old_table)。删除旧表。 - Imdad
你有没有查看 @Maksym Polshcha 的回答?你必须使用外键的名称而不是列名。(它可能是类似于 fk_customerid 的东西) - Imdad
请检查我的答案,如果您仍然有问题,请告诉我。 - Fahim Parkar
当我尝试在一个实际上不是外键的键上使用DROP FOREIGN KEY时,我也遇到了这个错误 - 改为使用DROP KEY解决了我的问题。 - StampyCode
5个回答

35

这里Chris White描述的解决方案对我有效。

根本问题是MySQL创建了索引和外键。必须删除两者(首先删除外键,与Chris所说的相反)。

  1. show create table table_name;

SHOW CREATE TABLE `table_name`:

| table_name | CREATE TABLE `table_name` (
  `id` int(20) unsigned NOT NULL auto_increment,
  `key_column` smallint(5) unsigned default '1',
  KEY `column_tablein_26440ee6` (`key_column`),  <--- shows key name
  CONSTRAINT `table_name_ibfk_1` FOREIGN KEY (`key_column`) REFERENCES <--- shows foreign key constraint name
`second_table` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  • 删除外键约束:

    ALTER TABLE table_name DROP FOREIGN KEY `table_name_ibfk_1`;
    
  • 删除该键

    ALTER TABLE table_name DROP KEY `column_tablein_26440ee6`;
    
  • 那对我来说就足够了。


    1
    +1 想补充一下,这个问题有很多类似的(可能是重复的)问题,而@bbrame的答案是对我有效的。 - Meetai.com
    1
    我在show create table 'name'中没有约束部分,但是当我执行desc 'name'时,我可以看到该字段具有外键约束。 - proprius
    这是一个完美的例子,展示了如何处理外键删除。非常感谢 @bbframe,它对我很有帮助。 - prashant

    7

    看起来是MySQL错误消息中的一个bug。(http://bugs.mysql.com/bug.php?id=10333

    使用SHOW CREATE TABLE table_name命令查看外键的实际名称。似乎mysql查询浏览器在生成查询时出现了外键名称拼写错误的问题。


    2
    知道我的约束是作为索引而创建的,而不是外键,这对我很有帮助。然后我使用了“DROP INDEX”子句。谢谢。 - Silvio Delgado

    6
    为了避免在尝试删除外键时出现此错误,请使用外键的约束名而不是列名。
    当我尝试执行以下操作:
    mysql> ALTER TABLE mytable DROP PRIMARY KEY;
    

    我遇到了错误,错误信息如下:
    ERROR 1025 (HY000): Error on rename of '.\database\#sql-454_3' to '.\database\mytable' (errno: 150).
    

    我用以下方法解决了这个问题:
    mysql> ALTER TABLE mytable DROP PRIMARY KEY, ADD PRIMARY KEY (column1,column2,column3);
    

    以下是一些有用的链接。

    链接 1

    链接 2 [请查找发布者为Alex Blume于2008年11月7日下午5:09和Hector Delgadillo于2011年1月21日上午4:57的内容]


    1
    为了避免在尝试删除外键时出现此错误,请使用外键的约束名而不是列名。

    0

    你应该像Fahim Parkar建议的那样尝试使用外键名称,但实际上这并不总是有效。

    在我的情况下,我使用了

    FOREIGN KEY `fk`(`col1`) REFERENCES `table2`(`col1`)
    

    添加外键的代码。

    这段代码存在问题,它不是有效的,应该会抛出某种语法错误,但它仍然添加了一个随机命名的外键。

    当我用正确的语法添加外键时:

    CONSTRAINT `fk` FOREIGN KEY (`col1`) REFERENCES `table2`(`col1`)
    

    以下代码已正确删除它:

    ALTER TABLE `table1` DROP FOREIGN KEY `fk`
    

    如果您尝试删除一个具有无效名称的外键,也可能会发生此类错误。查看表属性非常重要。

    SHOW CREATE TABLE `table1`
    

    如果您遇到此类错误,请检查外键名称。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接