mysqlエラー1025(HY000): './foo'の名前変更時のエラー(errorno: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はい、そうです。ただし、バウンティが終了するとブーティメッセージは表示されなくなるため、skipphoppyは彼女が選択した回答の下にコメントを追加する必要があります。
RandomSeed

回答:


240

テーブルがInnoDBエンジンを使用している場合、通常このエラーが発生します。その場合は、外部キーを削除してから、テーブルを変更して列を削除する必要があります。

しかし、トリッキーな部分は、列名を使用して外部キーを削除できないことです。その代わりに、インデックスの作成に使用される名前を見つける必要があります。それを見つけるには、次の選択を発行します。

SHOW CREATE TABLE領域;

これにより、次のようなインデックスの名前が表示されます。

制約のregion_ibfk_1外部キー(country_id)参照 countryid)削除のアクションなし更新のアクションなし

今単に発行します:

テーブル領域の変更、外部キーの削除 region_ibfk_1

そして最後に:

表領域のドロップ列country_idを変更します。

そして、あなたは行ってもいいです!


1つのALTER TABLEクエリで外部キーと列を削除することもできます。
ValentinGrégoire16年

いいね!私たちは外部キーを落とすべきです、すべてが大丈夫です!ありがとう!
Luan 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 2014

phpMyAdminでは、エンジンのステータスをストレージエンジンInnoDBInnoDBステータス
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
ERROR 1025(HY000):エラー「./table/#sql-14ae_81'への改名に(エラー番号:150)ので、MySQLのエラーのため、テーブルの異なる文字セットに切り替えながら、私はこれを必要
letsjump

7

dropステートメントで「FOREIGN KEY」の代わりに「KEY」を使用して、テーブル変更クエリを実行するだけです。それが問題の解決に役立ち、外部キー制約が削除され、テーブルの列を変更してテーブルを削除できることを願っています。

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

ここのDROP KEY代わりにDROP FOREIGN KEY

それがお役に立てば幸いです。

ありがとう


4

私は知っています、これは古い投稿ですが、エラー1025を探している場合、それはみんなのお気に入りの検索エンジンへの最初のヒットです。

ただし、この問題を修正するための簡単な「ハック」があります。

コマンドを実行する前に、次のコマンドを使用して外部キー制約チェックを無効にする必要があります。

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

1

MySQL Workbenchなどのクライアントを使用している場合は、外部キーを削除するテーブルを右クリックし、[外部キー]タブを選択してインデックスを削除します。

次に、次のようにクエリを実行できます。

alter table table_name drop foreign_key_col_name;

1

おそらく、変更しようとしている主キーを参照する外部キーを持つ別のテーブルが存在します。

エラーの原因となったテーブルを特定するには、実行SHOW ENGINE INNODB STATUSしてからLATEST FOREIGN KEY ERRORセクションをます

SHOW CREATE TABLEカテゴリを使用して、制約の名前を表示します。

ほとんどの場合、categorys_ibfk_1になります。

名前を使用して最初に外部キーを削除し、次に列を削除します。

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


0

外部キー制約の問題だと思います。country_idは別のテーブルで外部キーとして使用されますか?

私はDBの第一人者ではありませんが、fkを削除し、alter tableを実行してから、fkをやり直すことで、このような問題(fk制約があった場合)を解決したと思います。

私は結果がどうなるか聞いて興味があります-いつかmysqlはかなり不可解です。


Mysqlはひどい場合があります。通常は問題ありませんが、これらのエラーメッセージは正常です。事務所の人から簡潔な説明があったらここに投げます。
トレントン

0

私の場合、MySQLワークベンチを使用していて、テーブルに列の1つをドロップするときに同じ問題に直面しました。外部キーの名前が見つかりませんでした。次の手順に従って問題を解決しました。

  1. Rt。スキーマをクリックし、「スキーマインスペクター」を選択します。これにより、さまざまなテーブル、列、インデックスなどが得られます。

  2. 「インデックス」という名前のタブに移動し、「列」という名前の列の下の列の名前を検索します。見つかったら、「Table」という列名の下でこのレコードのテーブル名を確認します。必要なテーブルの名前と一致する場合は、「名前」という列の外部キーの名前を書き留めます。

  3. 次にクエリを実行します。ALTER table tableNamexx DROP KEY foreignKeyName;

  4. これで、正常に実行されるはずのdropステートメントを実行できます。


0

MySQL 5.6でこのエラーが発生しましたが、外部キーとは関係がありませんでした。これは、小さなLAN上のサーバーとして機能するWindows 7 Professionalマシン上にありました。

クライアントアプリケーションは、テーブルを作成するバッチ操作を実行し、テーブルにいくつかの外部データを入力してから、永続的なテーブルと結合するクエリを実行し、「一時的な」テーブルを削除しました。このバッチはこれを約300回実行し、この特定のルーチンは、バッチ内のランダムなポイントで突然エラー1025 Unname to rename問題が発生したときに、数週間にわたって毎週実行されていました。

私の場合、アプリケーションは4つのDDLステートメント、3つのCREATE INDEXに続くCREATE TABLEを使用しており、外部キーはありません。ただし、失敗した時点で実際に作成されるのは2つのインデックスだけで、実際のテーブルの.frmファイルの名前が変更されました。

私の解決策は、個別のCREATE INDEXステートメントを削除し、CREATE TABLEステートメントを使用して作成することでした。これを書いている時点で、これは私と私の誰かの問題を解決し、誰かがこのスレッドを見つけたときに頭を掻きました。


-2

averageRatings = FOREACH groupedRatings GENERATE group AS movieID、AVG(ratings.rating)AS avgRating、COUNT(ratings.rating)AS numRatings;

上記のようなコマンドを使用している場合は、グループを小文字で使用する必要があります。これは私の問題を解決するかもしれません。少なくともPIGスクリプトでは。


私はこれが問題に関連しているとは思わない、彼または彼女はmysqlの問題に直面している
Zdenek Machek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.