mysql错误1025(HY000):重命名“ ./foo”时出现错误(错误编号:150)是什么意思?


160

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

有任何想法吗?外键东西?


@skiphoppy-您是否要悬赏某个已经给出的答案?甚至允许吗?还是您的情况有所不同,在这种情况下,您应该启动另一个线程?
瑞克·詹姆斯

@RickJames是的。但是,跳台舞女应该在她选择的答案下添加她的评论,因为当赏金结束时,该胖子消息将消失。
RandomSeed

Answers:


240

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

但是棘手的是,您不能使用列名来删除外键,而是必须找到用于对其进行索引的名称。为此,请发出以下选择:

SHOW CREATE TABLE区域;

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

约束外region_ibfk_1键(country_id)参考 countryid)关于删除无操作更新无操作

现在只需发出:

修改表区域丢弃外键 region_ibfk_1;

最后是:

更改表区域放置列country_id;

而且你很好!


请注意,您还可以在一个ALTER TABLE查询中删除外键和列。
ValentinGrégoire16年

真好!我们应该放弃外键,一切都会好起来的!谢谢!
栾D

173

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

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

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

在您的情况下,很可能是因为某些内容引用了country_id列。


2
同样,另一个令人误解的MySQL显示错误...谢谢。
e2-e4

在phpMyAdmin中,您可以在Storage EnginesInnoDBInnoDB Status
Maxence

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;

这总是对我有用:)


1
由于mysql错误,我在切换到表的其他字符集时需要此:ERROR 1025(HY000):将'./table/#sql-14ae_81'重命名为(errno:150)时
出错

7

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

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

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

希望会有所帮助。

谢谢


4

我知道,这是一篇过时的文章,但是如果您要查找错误1025,则它是每个人都喜欢的搜索引擎的第一击。

但是,有一个简单的“ hack”可解决此问题:

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

SET FOREIGN_KEY_CHECKS = 0;

然后,您可以执行命令。

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

SET FOREIGN_KEY_CHECKS = 1;

祝您一切顺利。


在xampp上安装octobercms时遇到问题,最终这有所帮助。
jahackbeth

2

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

您不能使用列名删除外键,而要在PHPMyAdmin或MySQL中绕过此外键,请先删除外键约束,然后再重命名或删除属性。


1

查看您的mysql数据库的错误文件。根据错误#26305,我的sql没有给出原因。从MySQL 4.1开始存在此错误;-)


我发现您的某些答案难以理解,但是+1链接到错误报告。显然,它已在MySQL v5.6.6中修复。:)
mwfearnley '16

1

如果使用的是MySQL Workbench之类的客户端,请右键单击要从中删除外键的表,然后选择“外键”选项卡并删除索引。

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

alter table table_name drop foreign_key_col_name;

1

可能还有另一个带有外键的表,该表引用您要更改的主键。

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

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

最有可能是category_ibfk_1

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

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


0

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

我不是数据库专家,但我认为我可以通过删除fk,执行alter table的操作然后重做fk的操作来解决此类问题(存在fk约束)。

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


MySQL可能很糟糕。通常很好,但是那些错误消息,但是。如果我们从办公室的某人那里得到一个简洁的解释,我将其放在这里。
特伦顿

0

就我而言,我使用的是MySQL工作台,在将我的其中一列放在表中时遇到了同样的问题。我找不到外键的名称。我按照以下步骤解决了该问题:

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

  2. 转到名为“索引”的选项卡,然后在名为“列”的列下搜索列的名称。找到后,在“表”列名下检查该记录的表名。如果它与所需表的名称匹配,则从名为“名称”的列中记下外键的名称。

  3. 现在执行查询:ALTER table tableNamexx DROP KEY foreignKeyName;

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


0

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

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

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

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


-2

averageRatings = FOREACH groupedRatings 生成组 as movieID,AVG(ratings.rating)AS平均,COUNT(ratings.rating)AS numRatings;

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


我不认为这与问题有关,他或她正在遇到mysql问题
Zdenek Machek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.