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

时间:2008-10-01 23:33:22

标签: mysql mysql-error-1025

我在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)

有什么想法吗?外键的东西?

14 个答案:

答案 0 :(得分:232)

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

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

  

SHOW CREATE TABLE区域;

这应该显示索引的名称,如下所示:

  

约束region_ibfk_1外国人   KEY(country_id)参考   countryid)ON DELETE NO   更新行动没有行动

现在只需发出:

  

alter table region drop foreign key   region_ibfk_1;

最后是:

  

alter table region drop column   COUNTRY_ID;

你很高兴去!

答案 1 :(得分:173)

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

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

要查找有关失败的更多详细信息,可以使用SHOW ENGINE INNODB STATUS并查找最新的FOREIGN KEY ERROR部分,其中包含有关错误的详细信息。

在您的情况下,很可能导致某些内容引用country_id列。

答案 2 :(得分:14)

尝试删除不存在的外键时,也会遇到此错误。因此,在删除外键时,请务必确保它们确实存在。

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

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;

这对我来说总能解决问题:)

答案 3 :(得分:7)

只需在drop语句中使用'KEY'而不是'FOREIGN KEY'运行alter table查询。我希望它有助于解决问题,并将删除外键约束,您可以更改表列并删除表。

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

此处DROP KEY代替DROP FOREIGN KEY

希望它会有所帮助。

由于

答案 4 :(得分:2)

我曾经遇到过类似的问题。我从表A中删除了主键,但当我尝试从表B中删除外键列时,我显示了上述相同的错误。

您不能使用列名删除外键并在PHPMyAdmin或MySQL中绕过它,首先在重命名或删除属性之前删除外键约束。

答案 5 :(得分:2)

我知道,这是一篇很老的帖子,但如果您正在寻找错误1025,那么这是所有人最喜欢的搜索引擎。

然而,解决这个问题很容易“黑客”:

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

SET FOREIGN_KEY_CHECKS = 0;

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

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

SET FOREIGN_KEY_CHECKS = 1;

祝你好运。

答案 6 :(得分:1)

查看mysql数据库的错误文件。根据{{​​3}}我的sql没有给你原因。自MySQL 4.1以来存在此错误; - )

答案 7 :(得分:1)

如果您使用的是像MySQL Workbench这样的客户端,请右键单击要删除外键的所需表,然后选择外键选项卡并删除索引。

然后你可以像这样运行查询:

alter table table_name drop foreign_key_col_name;

答案 8 :(得分:1)

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

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

使用SHOW CREATE TABLE类别显示约束名称。

最有可能是categories_ibfk_1

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

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

答案 9 :(得分:1)

否则

SET FOREIGN_KEY_CHECKS=0;
在操作之前

也可以做到这一点。

答案 10 :(得分:0)

我猜外键约束问题。 country_id是否用作另一个表中的外键?

我不是数据库大师,但我认为通过删除fk,执行我的alter table内容然后重做fk内容,我解决了这样的问题(其中存在fk约束)。

我很想知道结果是什么 - 有时mysql非常神秘。

答案 11 :(得分:0)

在我的情况下,我使用的是MySQL工作台,我在将一个列放入表中时遇到了同样的问题。我找不到外键的名字。我按照以下步骤解决了问题:

  1. 室温。单击您的架构,然后选择架构检查器'。这为您提供了各种表格,列,索引等。

  2. 转到名为'索引'的标签并在名为'列'的列下搜索列的名称。找到后,在列名称'表'下检查此记录的表名称。如果它与您想要的表的名称匹配,请记下名为'名称'。

  3. 的列中的外键名称。
  4. 现在执行查询:ALTER table tableNamexx DROP KEY foreignKeyName;

  5. 现在您可以执行将成功执行的drop语句。

答案 12 :(得分:0)

我在MySQL 5.6中遇到此错误,但与外键无关。这是在充当小型LAN上的服务器的Windows 7 Professional计算机上。

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

在我的情况下,应用程序使用4个DDL语句,一个CREATE TABLE和3个CREATE INDEX,没有外键。但是,实际上只有两个索引可以创建,并且在出现故障时会重命名实际的表.frm文件。

我的解决方案是摆脱单独的CREATE INDEX语句,并使用CREATE TABLE语句创建它们。在撰写本文时,这已经为我解决了这个问题,也为我帮助别人找到该线程时挠头的问题提供了帮助。

答案 13 :(得分:-2)

averageRatings = FOREACH groupedRatings GENERATE group AS movieID,AVG(ratings.rating)AS平均,COUNT(ratings.rating)AS numRatings;

如果使用上述任何命令,则必须使用小写字母group。这可能会解决您解决我的问题。至少在PIG脚本中。