代码之家  ›  专栏  ›  技术社区  ›  Trenton

mysql错误1025(hy000):'/foo'(errorno:150)的重命名错误是什么意思?

  •  154
  • Trenton  · 技术社区  · 16 年前

    我在MySQL中尝试过:

    mysql> alter table region drop column country_id;
    

    得到这个:

    ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
    './product/region' (errno: 150)
    

    有什么想法吗?外国钥匙?

    13 回复  |  直到 5 年前
        1
  •  232
  •   Jeshurun    13 年前

    如果表使用innodb引擎,通常会出现此错误。在这种情况下,您必须删除外键,然后执行alter表并删除列。

    但比较棘手的是,不能使用列名删除外键,而是必须找到用于索引它的名称。要查找此问题,请发出以下选择:

    显示创建表区域;

    这将向您显示索引的名称,如下所示:

    约束 region_ibfk_1 外国的 密钥(密钥) country_id 参考文献 country ( id )删除NO 更新时的操作无操作

    现在只需发布:

    更改表区域删除外键 区域Ibfk1 ;

    最后一个:

    更改表区域删除列 农村居民身份证;

    你很高兴去!

        2
  •  173
  •   dmckee --- ex-moderator kitten    10 年前

    这确实是一个外键错误,您可以使用perror找到:

    shell$ perror 150
    MySQL error code 150: Foreign key constraint is incorrectly formed
    

    要了解有关失败原因的更多详细信息,可以使用 SHOW ENGINE INNODB STATUS 并查找最新的外键错误部分,其中包含有关错误的详细信息。

    在您的案例中,这很可能是因为某些内容引用了Country_id列。

        3
  •  14
  •   Jeroen    15 年前

    您还可以在尝试删除不存在的外键时获得此错误。因此,在删除外键时,一定要确保它们确实存在。

    如果外键确实存在,并且您仍然收到此错误,请尝试以下操作:

    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
    

    //把外键放在这里!

    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    

    这对我总是有好处的:)

        4
  •  7
  •   Prahalad Gaggar    11 年前

    只需在drop语句中使用'key'而不是'foreign key'来运行alter table查询。我希望它能帮助解决这个问题,并删除外键约束,您可以更改表列并删除表。

    ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;
    

    在这里 DROP KEY 而不是 DROP FOREIGN KEY ,

    希望能有所帮助。

    谢谢

        5
  •  2
  •   Joomler    8 年前

    我也有过类似的问题。我从表A中删除了主键,但当我试图从表B中删除外键列时,出现了上述相同的错误。

    不能使用列名删除外键,若要在phpmyadmin或mysql中绕过此项,请在重命名或删除属性之前先删除外键约束。

        6
  •  2
  •   Baccata    7 年前

    我知道,这是一篇老文章,但是如果你要查找错误1025,这是第一篇关于每个人最喜欢的搜索引擎的文章。

    然而,有一个简单的“黑客”来解决这个问题:

    在执行命令之前,首先必须使用以下命令禁用外键约束检查:

    SET FOREIGN_KEY_CHECKS = 0;
    

    然后您就可以执行您的命令了。

    完成后,不要忘记使用以下命令再次启用外键约束检查:

    SET FOREIGN_KEY_CHECKS = 1;
    

    祝你的努力好运。

        7
  •  1
  •   marabol    14 年前

    查看MySQL数据库的错误文件。根据 Bug #26305 我的SQL没有给出原因。此bug自MySQL4.1以来就存在;-)

        8
  •  1
  •   iltaf khalid    11 年前

    如果您使用的是像mysql workbench这样的客户机,请右键单击要从中删除外键的所需表,然后选择“外键”选项卡并删除索引。

    然后您可以这样运行查询:

    alter table table_name drop foreign_key_col_name;
    
        9
  •  1
  •   youngdero    8 年前

    可能有另一个表的外键引用了您要更改的主键。

    要找出导致错误的表,可以运行 SHOW ENGINE INNODB STATUS 然后看看 LATEST FOREIGN KEY ERROR 部分

    使用“显示创建表类别”显示约束的名称。

    最有可能是类别“IBFK”1

    使用名称首先删除外键,然后删除列:

    ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
    ALTER TABLE categories DROP COLUMN assets_id;
    
        10
  •  1
  •   Jan Tchärmän    7 年前

    SET FOREIGN_KEY_CHECKS=0;
    

    手术前也可以做这个把戏。

        11
  •  0
  •   itsmatt    16 年前

    我猜是外键约束问题。国家/地区ID是否用作另一个表中的外键?

    我不是db guru,但我认为我通过删除fk、执行alter table操作,然后重新执行fk操作,解决了这样一个问题(其中存在fk约束)。

    我很想知道结果是什么——有时候MySQL相当神秘。

        12
  •  0
  •   chepaiytrath    8 年前

    在我的例子中,我使用的是MySQLWorkbench,在将一个列放到表中时遇到了同样的问题。我找不到外键的名称。我按照以下步骤解决了这个问题:

    1. rt.单击您的模式,然后选择“模式检查器”。这将为您提供各种表、列、索引等。

    2. 转到名为“indexes”的选项卡,搜索名为“column”的列下的列名称。一旦找到,请在列名“table”下检查该记录的表名。如果它与所需表的名称匹配,请在名为“name”的列中记下外键的名称。

    3. 现在执行查询:alter table tablenamexx drop key foreignkeyname;

    4. 现在可以执行drop语句,该语句将成功执行。

        13
  •  0
  •   Chris Millard    5 年前

    我在MySQL5.6中得到了这个错误,但它与外键无关。这是在一台Windows7专业版机器上,充当一个小型局域网上的服务器。

    客户机应用程序正在执行一个批处理操作,该操作创建一个表,用一些外部数据填充它,然后运行一个与永久表联接的查询,然后删除“临时”表。这个批处理大约执行了300次,这个特定的例程已经连续运行了几年,突然出现了错误1025,无法在批处理中的任意点重命名问题。

    在我的例子中,应用程序使用了4个DDL语句,一个创建表,后面跟着3个创建索引,没有外键。但是,只有2个索引被实际创建,而实际的table.frm文件在失败时被重命名。

    我的解决方案是去掉单独的create index语句,并使用create table语句创建它们。在写作的时候,这个问题已经为我和我的帮助解决了,当别人发现这个线索的时候,他们会抓他们的头。