web-dev-qa-db-ja.com

mysqlエラー1025(HY000): './foo'の名前変更エラー(errno:150)はどういう意味ですか?

私は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)

何か案は?外部キーのもの?

156
Trenton

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

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

SHOW CREATE TABLEリージョン。

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

制約region_ibfk_1外部キー(country_id)参照countryid)ON DELETE NO ACTION ON UPDATE NO ACTION

次に、単に発行します:

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

そして最後に:

テーブル領域のドロップ列country_idを変更します。

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

234
Jeshurun

それは確かに外部キーエラーです。perrorを使用して調べることができます。

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

失敗したものの詳細を調べるには、SHOW ENGINE INNODB STATUSを使用して、何が間違っているかに関する詳細が含まれている最新の外部キーエラーセクションを探します。

あなたの場合、country_id列を参照している何かが原因である可能性が最も高いです。

173
Harrison Fisk

存在しない外部キーを削除しようとすると、このエラーが発生することもあります。そのため、外部キーをドロップするときは、実際に存在することを常に確認してください。

外部キーが存在し、まだこのエラーが発生する場合は、次を試してください。

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;

これは常に私のためのトリックを行います:)

14
Jeroen

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

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

ここではDROP KEYの代わりにDROP FOREIGN KEYで、

それが役立つことを願っています。

ありがとう

7
Sohail

これは古い投稿ですが、エラー1025を探している場合、誰もがお気に入りの検索エンジンで最初にヒットするものです。

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

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

SET FOREIGN_KEY_CHECKS = 0;

その後、コマンドを実行できます。

完了したら、次のコマンドを使用して、外部キー制約チェックを再度有効にすることを忘れないでください。

SET FOREIGN_KEY_CHECKS = 1;

頑張ってください。

2
Baccata

同じような問題が一度ありました。表Aから主キーを削除しましたが、表Bから外部キー列を削除しようとしたときに、上記と同じエラーが表示されました。

列名を使用して外部キーを削除することはできません。PHPMyAdminまたはMySQLでこれをバイパスするには、まず属性の名前を変更または削除する前に外部キー制約を削除します。

2
Joomler

やること

SET FOREIGN_KEY_CHECKS=0;

操作がトリックを行う前に。

1
Jan Tchärmän

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

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

alter table table_name drop foreign_key_col_name;
1
iltaf khalid

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

どのテーブルがエラーを引き起こしたかを見つけるには、SHOW ENGINE INNODBSTATUSを実行し、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;
1
youngdero

Mysqlデータベースのエラーファイルを見てください。 Bug#26305 によると、私のSQLはあなたに原因を与えません。このバグはMySQL 4.1以降に存在します;-)

1
marabol

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

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

私は結果が何であるかを聞くことに興味があります-いつかmysqlはかなり不可解です。

0
itsmatt

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

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

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

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

0
Chris Millard

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

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

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

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

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

0
Jatin Shashoo