165

.sqlファイルをインポートしようとしていますが、テーブルの作成に失敗します。

失敗するクエリは次のとおりです。

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;    

同じデータベースから.sqlをエクスポートし、すべてのテーブルを削除しましたが、インポートしようとしていますが、なぜ失敗するのですか?

MySQL:テーブル'./dbname/data.frm'を作成できません(errno:150)

4

35 に答える 35

173

MySQLから-外部キー制約のドキュメント:

ドロップされたテーブルを再作成する場合は、それを参照する外部キー制約に準拠する定義が必要です。前述のように、正しい列名とタイプが必要であり、参照されるキーにインデックスが付いている必要があります。これらが満たされない場合、MySQLはエラー1005を返し、エラーメッセージでエラー150を参照します。これは、外部キー制約が正しく形成されなかったことを意味します。同様に、エラー150が原因でALTER TABLEが失敗した場合、これは、変更されたテーブルに対して外部キー定義が誤って形成されることを意味します。

于 2010-10-31T00:39:14.140 に答える
101

エラー150は、外部キーに問題があることを意味します。おそらく、外部テーブルのキーはまったく同じタイプではありませんか?

于 2010-10-31T00:28:48.040 に答える
68

実行して出力SHOW ENGINE INNODB STATUS;を探すことにより、実際のエラーメッセージを取得できます。LATEST FOREIGN KEY ERROR

出典:同様の質問に対する別のユーザーからの回答

于 2014-07-23T17:28:30.497 に答える
31

データ型は完全に一致する必要があります。varcharタイプを処理している場合、テーブルは同じ照合を使用する必要があります。

于 2010-12-09T13:46:52.980 に答える
28

正解であるにもかかわらず、これらすべての答えは質問に誤解を招くと思います。

外部キーを使用してダンプファイルを復元する場合、実際の答えは、復元を開始する前にこれです。

SET FOREIGN_KEY_CHECKS=0;

当然、外部テーブルが存在する前に、復元によっていくつかの制約が作成されるためです。

于 2013-04-25T12:14:24.430 に答える
24

関連するテーブル間に異なるエンジンがある場合、このエラーメッセージが表示されることがあります。たとえば、テーブルがInnoDBを使用し、他のテーブルがMyISAMを使用している場合があります。両方が同じである必要があります

于 2011-08-03T11:53:40.470 に答える
12

エラー番号 150は、外部キー制約の失敗を意味します。外部キーが依存するテーブル(table keywords)の前に、このテーブルを作成している可能性があります。最初にそのテーブルを作成すると、正常に機能するはずです。

そうでない場合は、外部キーステートメントを削除し、テーブルの作成後に追加します。特定の制約の失敗に関するより意味のあるエラーメッセージが表示されます。

于 2010-10-31T00:29:51.807 に答える
10

errno 150を引き起こす可能性のあるものはかなりたくさんあるので、このトピックを検索する人々にとって、これが網羅的なリストに近いと私が思うものです(Errno 150のソースの原因):

errno150またはerrno121の場合、SHOW ENGINE INNODB STATUSと入力するだけで、「LATESTFOREIGNKEYERROR」というセクションがあります。その下で、それはあなたに非常に役立つエラーメッセージを与えるでしょう、そしてそれは通常あなたに何が問題であるかをすぐに教えてくれます。実行するにはSUPER権限が必要なので、それがない場合は、次のシナリオをテストする必要があります。

1)データ型が一致しない:列の型は同じである必要があります

2)インデックス付けされていない(または間違った順序でインデックス付けされている)親列

3)列の照合が一致しない

4)NOTNULL列でSETNULLを使用する

5)テーブル照合が一致しない:列照合が一致する場合でも、一部のMySQLバージョンではこれが問題になる可能性があります。

6)親列が実際には親テーブルに存在しません。スペルをチェックします(そしておそらく列の最初または最後のスペース)

7)1つの列のインデックスの1つが不完全であるか、列が長すぎて完全なインデックスを作成できません。MySQL(微調整しない限り)の最大単一列キー長は767バイトであることに注意してください(これはvarchar(255)UTF列に対応します)

errno 121が発生した場合、次の原因がいくつかあります。

1)選択した制約名はすでに使用されています

2)一部のシステムでは、ステートメント名とテーブル名に大文字と小文字の違いがある場合。ケース処理ルールが異なるサーバー間を移動する場合、これは問題になる可能性があります。

于 2015-03-18T17:21:09.867 に答える
9

MySQLが非常に愚かである場合があります-外部キーの理由の原因を理解できます..しかし、私の場合、データベース全体を削除したばかりで、それでもエラーが発生します...なぜですか?つまり、データベースはもうありません...そして私が使用しているsql-userはサーバー上の他のデータベースにアクセスできません...つまり、サーバーは現在のユーザーにとって「空」であり、私はまだ取得しますこのエラー?申し訳ありませんが、MySQLは私に嘘をついていると思います...しかし、私はそれに対処できます:)あなたのファッキーなステートメントの周りにSQLのこれらの2行を追加するだけです:

SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;

これでSQLを実行する必要があります...本当に外部キーの問題がある場合は、チェックを再度有効にする行が表示されます。これは失敗します。しかし、私のサーバーは静かです:)

于 2013-07-18T16:08:01.030 に答える
5

私も同じ問題を抱えていました。これは、テーブルの列の照合文字セットに関連していました。2つのテーブルの両方の列で文字セット照合が同じである必要があります。その上に外部キーを設定したい場合。例-usersテーブルのuserID列を参照するuserImageテーブルのuserID列に外部キーを配置した場合、照合は、テーブルの両方の列のutf8_general_ciと文字セットutf8と同じである必要があります。通常、テーブルを作成するとき、mysqlはサーバー設定からこれら2つの構成を取得します。

于 2018-07-10T09:08:11.040 に答える
4

上記の回答を調べて少し実験した後、これはMySQLの外部キーエラー(1005-エラー150)を解決するための効果的な方法です。

外部キーを適切に作成するために、MySQLが要求するのは次のとおりです。

  • 参照されるすべてのキーには、PRIMARYまたはUNIQUEインデックスが必要です。
  • 参照する列は、参照される列と同じデータ型である必要があります。

これらの要件を満たせば、すべてがうまくいくでしょう。

于 2013-07-03T14:50:00.167 に答える
4

WindowsアプリケーションをLinuxに移植したときに、このエラーが発生しました。Windowsでは、データベーステーブル名は大文字と小文字を区別しません。また、Linuxでは、おそらくファイルシステムの違いにより、大文字と小文字を区別します。したがって、WindowsのテーブルTable1は、と同じtable1であり、REFERENCES両方table1Table1機能します。Linuxでは、データベース構造を作成するtable1代わりにアプリケーションを使用するとTable1、エラー#150が発生しました。参照で正しい文字の大文字小文字を区別するとTable1、Linuxでも機能し始めました。したがって、他に何も役に立たないREFERENCES場合は、Linuxを使用しているときに、テーブル名に正しい大文字と小文字を使用していることを確認してください。

于 2014-04-23T14:34:58.393 に答える
4

通常、外部キーと主キーの不一致によりエラーが発生します:150。

外部キーは、主キーと同じデータ型である必要があります。また、主キー符号なしの場合、外部キー符号なしである必要があります。

于 2017-11-24T12:04:04.600 に答える
3

テーブルのエンジンを変更します。innoDBのみが外部キーをサポートします

于 2012-04-17T16:14:48.177 に答える
3

PKテーブルを1つのCHARSETで作成し、次にFKテーブルを別のCHARSETで作成すると、このエラーが発生する可能性があります...私もこのエラーが発生しましたが、文字セットをPK文字セットに変更した後、エラーなしで実行されました

create table users
(
------------
-------------
)DEFAULT CHARSET=latin1;


create table Emp
(
---------
---------
---------
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1;
于 2012-10-16T10:19:28.920 に答える
3

このエラーは、2つのテーブルに参照がある場合に発生する可能性があります。たとえば、1つのテーブルがStudentで、もう1つのテーブルがEducationであり、EducationテーブルにStudentテーブルの外部キー参照を持たせたい場合です。この場合、両方のテーブルの列データ型は同じである必要があります。同じでない場合、エラーが発生します。

于 2013-12-23T05:53:52.747 に答える
3

ほとんどの場合、問題はENGINEの違いが原因です。親がInnoDBによって作成されている場合、参照されるテーブルはMyISAMによって作成されているはずであり、その逆も同様です。

于 2015-06-16T14:34:56.083 に答える
3

私の場合。ホスティングサーバーが設定を変更し、新しいテーブルがMyISAMでしたが、古いテーブルがInnoDBであるため、エンジンと文字セットに問題がありました。ただ私が変わった。

于 2015-10-29T14:39:05.997 に答える
2

主キー列と参照列の両方が同じデータ型と属性(符号なし、バイナリ、符号なしゼロフィルなど)を持っていることを確認してください。

于 2013-09-19T05:43:50.300 に答える
2

実際のエッジケースは、MySQLツール(私の場合はSequel Pro)を使用してデータベースの名前を変更した場合です。次に、同じ名前のデータベースを作成しました。

これにより、外部キー制約が同じデータベース名に保持されたため、名前が変更されたデータベース(my_db_renamedなど)には、新しく作成されたデータベース(my_db)に外部キー制約がありました。

これがSequelProのバグなのか、それともいくつかのユースケースでこの動作が必要なのかはわかりませんが、朝の大部分の費用がかかりました:/

于 2014-11-06T12:45:21.220 に答える
2

子テーブルから参照しているPARENTテーブルの列は一意である必要があります。そうでない場合は、エラー番号150を発生させます。

于 2014-11-22T18:59:13.033 に答える
2

同じエラーが発生しました。私の場合、エラーの理由は、制約にON DELETE SET NULLステートメントがあり、その定義に制約を置いたフィールドにNOTNULLステートメントがあったためです。フィールドでNULLを許可すると、問題が解決しました。

于 2015-01-06T12:51:09.717 に答える
2

テキストファイルからDBを作成しているときに、この種の問題に直面しました。

mysql -uroot -padmin < E:\important\sampdb\createdb.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 

上記の行を書き込んでCreate.bat、batファイルを実行しました。

私の間違いは、私のsqlファイルでの実行の順序にあります。主キーと外部キーを使用してテーブルを作成しようとしました。実行中は参照テーブルを検索しますが、テーブルはありません。したがって、そのようなエラーが返されます。

外部キーを使用してテーブルを作成する場合は、参照テーブルが存在するかどうかを確認してください。また、参照テーブルとフィールドの名前も確認してください。

于 2016-01-14T13:09:26.890 に答える
2

同様の問題が発生しましたが、データのある既存のテーブルに新しいフィールドを追加していて、新しいフィールドが親テーブルの別のフィールドを参照していて、定義がNOT NULLで、デフォルト値がないためです。-物事がうまくいかなかった理由は

  1. 新しいフィールドでは、制約を適用する前に、各レコードの親テーブルの値を空白のフィールドに自動入力する必要がありました。制約が適用されるたびに、テーブルデータの整合性をそのままにしておく必要があります。制約(外部キー)を実装しますが、親テーブルの値を持たないデータベースレコードがいくつかあった場合、データが破損していることを意味するため、MySQLは制約を強制しません

通常の状況では、データベースを事前に計画し、データ挿入の前に制約を実装した場合、この特定のシナリオは回避されることを覚えておくことが重要です。

この落とし穴を回避するためのより簡単なアプローチは、

  • データベーステーブルのデータを保存する
  • テーブルデータ(およびテーブルアーティファクト、つまりインデックスなど)を切り捨てます
  • 制約を適用する
  • データをインポートする

これが誰かに役立つことを願っています

于 2016-10-24T11:04:43.427 に答える
2

外部キーなしでテーブルを作成してから、外部キーを個別に設定します。

于 2017-11-17T10:02:31.307 に答える
1

おそらくこれは役に立ちますか?主キー列の定義は、外部キー列とまったく同じである必要があります。

于 2012-10-02T05:16:11.380 に答える
1

すべてのテーブルが外部キーをサポートできることを確認してください-InnoDBエンジン

于 2013-03-21T15:22:38.863 に答える
1

単一のテーブルでDjangomysqlデータベースをダンプするときにも同様の問題が発生しました。データベースをテキストファイルにダンプし、emacsを使用して問題のテーブルをファイルの最後に移動し、変更されたsqlダンプファイルを新しいインスタンスにインポートすることで、問題を修正することができました。

HTHUwe

于 2015-07-16T16:07:00.397 に答える
1

変数を受け入れるようにすることで問題を修正しましたnull

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
于 2016-04-14T15:50:54.823 に答える
1

一連のMySQLコマンドを実行したときに同じ問題が発生しました。まだ作成されていない他のテーブルへの外部キーを参照するときに、テーブルの作成中に鉱山が発生します。これは、参照する前のテーブルの存在のシーケンスです。

解決策:外部キーを持つ子テーブルを作成する前に、まず親テーブルを作成します。

于 2017-10-25T05:03:27.367 に答える
1

同じエラーが発生したので、最初に参照テーブルを作成し、次に参照テーブルを作成しました

たとえば、employeeテーブルとdepartmentテーブルがあり、employeeテーブルのdept_noに外部制約を割り当てる場合は、departmentテーブルが作成され、主キー制約がdept_noに割り当てられていることを確認してください。

これは私のために働いた...

于 2017-11-28T11:51:20.817 に答える
0

ドロップされたテーブルを再作成する場合は、それを参照する外部キー制約に準拠する定義が必要です。前述のように、正しい列名とタイプが必要であり、参照されるキーにインデックスが付いている必要があります。これらが満たされない場合、MySQLはエラー1005を返し、エラーメッセージでエラー150を参照します。これは、外部キー制約が正しく形成されなかったことを意味します。同様に、ALTER TABLEエラー150が原因で失敗した場合、これは、変更されたテーブルに対して外部キー定義が誤って形成されることを意味します。

于 2018-07-21T19:31:47.167 に答える
0
execute below line:
  SET FOREIGN_KEY_CHECKS = 0;


FOREIGN_KEY_CHECKS option specifies whether or not to check foreign key constraints for InnoDB tables. 

-- Specify to check foreign key constraints (this is the default)

    SET FOREIGN_KEY_CHECKS = 1;
 

-- Do not check foreign key constraints

   SET FOREIGN_KEY_CHECKS = 0;


When to Use :
Temporarily disabling referential constraints (set FOREIGN_KEY_CHECKS to 0) is useful when you need to re-create the tables and load data in any parent-child order.
于 2019-09-06T11:43:24.247 に答える
0

ばかげた間違いですが、主キーとして参照されていた親プロパティを定義するのを忘れていたため、「errno:150」が表示されました。

他の誰かが同じ問題を抱えている場合に備えて共有するだけです。

于 2022-01-20T12:55:38.447 に答える
-7

試す:

CREATE TABLE `data` (
  `id` int(10) unsigned NOT NULL,
  `name` varchar(100) NOT NULL,
  `value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1`,
FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;  

との間に「、」を入れる必要がCONSTRAINTありFOREIGNます。

于 2012-08-07T18:43:05.953 に答える