web-dev-qa-db-ja.com

laravel errno 150外部キー制約の形式が正しくありません

誰かがこの問題を解決するのを手伝ってくれますか?

2つの外部キーを持つ3つのテーブルがあります。

         Schema::create('users', function (Blueprint $table) {
                    $table->increments('id');
                    $table->string('name');
                    $table->string('email')->unique();
                    $table->string('password');
                    $table->rememberToken();
                    $table->timestamps();
                });

        Schema::create('firms', function (Blueprint $table) {
                    $table->increments('id');
                    $table->string('title')->nullable();  
                    $table->integer('user_id')->unsigned()->nullable();
                    $table->foreign('user_id')->references('id')->on('users');
                    $table->timestamps();
                });
       Schema::create('jobs', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title')->nullable();
            $table->integer('firm_id')->unsigned()->nullable();
            $table->foreign('firm_id')->references('id')->on('firms');
            $table->timestamps();
        });

移行の実行後のエラー:

[Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1005 Can't create table `job`.`#sql-5fc_a1`
   (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter ta
  ble `firms` add constraint `firms_user_id_foreign` foreign key (`user_id`)
  references `users` (`id`))

  [PDOException]
  SQLSTATE[HY000]: General error: 1005 Can't create table `job`.`#sql-5fc_a1`
   (errno: 150 "Foreign key constraint is incorrectly formed")
11
Yrtymd

外部キーの場合、参照フィールドと参照フィールドはまったく同じデータ型である必要があります。

idusersの両方にfirmsフィールドをsigned integerとして作成します。ただし、両方の外部キーをnsigned integerとして作成するため、キーの作成は失敗します。

unsigned句をidフィールド定義に追加するか、外部キーフィールドからunsigned句を削除する必要があります。

22
Shadow

ほとんどの場合、この種のエラーは、両方のテーブルでdatatypeの不一致が原因で発生します。

主キーテーブルと外部キーテーブルの両方で同じデータ型と同じオプションを使用する必要があります。

例えば:

ユーザー

        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });

注文

 Schema::create('orders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('product_id')->unsigned();
            $table->foreign('product_id')->references('id')->on('products');
            $table->bigInteger('user_id')->unsigned();
           $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->timestamp('added_on');
        });

上記の例では、オーダーテーブルからユーザーテーブルに外部キーを割り当てようとしていますが、オーダーテーブルにはbigInteger datatableがありますが、ユーザーテーブルには単純な整数があります。それがこの種のエラーを生成する理由です。

また、主キーまたは外部キーでnsigned()nullable()などのオプションを使用した場合は、両方の場所で同じものを使用する必要があります。

4
Mayank Dudakiya

この回答は、それ以前の6つの回答よりも優れているわけではありませんが、_laravel-errno-150-foreign-key-constraint-is-incorrectly-formed_の原因とlaravelの修正方法に関する包括的な回答です。

1)Spelling:多くの場合、参照された_column name_または参照された_table name_の間違ったつづりがこのエラーをスローすることがあります。エラートレースはあまり説明的ではないのでわかりません。

2)Unique:参照列は、列に->primary()を追加するか、->unique()を追加することにより一意でなければなりません移行の定義。

3)データ型:参照フィールドと参照フィールドは、まったく同じデータ型でなければなりません。これは十分に強調することはできません。

  • bigincrementsの期待されるデータ型はbigInteger('column_name')->unsigned();です

  • 予想されるincrementsinteger('column_name')->unsigned();などです。

4)Remnants:このエラーが発生しても、テーブルは移行されず、移行されますが、外部キー列は設定されず、 _migration table_に追加されないため、_php artisan migrate:reset_を実行すると、障害のあるテーブルを除く他のテーブルが削除されるため、エラーを回避するために障害のあるテーブルを手動で削除することをお勧めします。

5)Order:これは多くの場合、このエラーの最も一般的な原因です。referencedであるテーブルは、_reference table_それ以外の場合、職人は外部キーを統合する場所を見つけられません。移行プロセスの順序を確認するには、移行ファイルの名前を変更します。例:

  • テーブルA:_2014_10_12_000000_create_users_table.php_および
  • テーブルB:_2014_10_12_100000_create_password_resets_table.php_

これは、変更するためにテーブルAが常にテーブルBの前に来ることを示し、テーブルBの名前を_2014_10_11_100000_create_password_resets_table.php_に変更し、テーブルAの前に移行することを示します。

6)外部キーを有効にする:他のすべてが失敗した場合、移行コードの前にSchema::enableForeignKeyConstraints();内にfunction up()を追加します例:

_class CreateUsersTable extends Migration
{
 /**
  * Run the migrations.
  *
  * @return void
  */
 public function up()
 {
    Schema::enableForeignKeyConstraints();
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
 }

 /**
  * Reverse the migrations.
  *
  * @return void
  */
 public function down()
 {
    Schema::dropIfExists('users');
 }
}
_

詳しくは laravel外部キー および laravel移行 をご覧ください。

コメントのおかげで見逃した修正について言及してください。

4
Bobby Axe

PHP laravel 5.8この形式で符号なし修飾子を使用

$table->unsignedBigInteger('user_id');

データベース内のすべてのテーブルを削除し、移行を再度実行します

1
Tino Tadez
  • ユーザー
  • キャッシャーはユーザーを指します
  • 学生はレジ係を紹介します

さらに、laravelで外部キーを宣言するときは、参照しているすべてのテーブルが一番上にある必要があります。この場合、 "-> unsigned()"修飾子を使用できます。

1
Louie Guides

私たちはテーブルビルです

Schema::create('villes', function (Blueprint $table) {
            $table->bigIncrements('idVille'); // bigIncrement(8 bits)
            $table->string('nomVille');
            $table->timestamps();
        });

exempleのテーブルユーザーの外部キー:

Schema::table('users', function (Blueprint $table) {
            $table->bigInteger('ville_idVille')->unsigned()->after('tele');
            $table->foreign('ville_idVille')->references('idVille')->on('villes');
        });
1
Saad Tejda

参照フィールドを設定し、まったく同じデータ型であるがエラーが存在する場合、日付移行ファイルをその動作だけを変更できます

0
Ehab Elzeny

これは、laravelアプリをテストし、データベース移行の対象となるテストでMySQLのインスタンスを使用した場合に発生します。

テストを実行する前に、私の移行は正常に動作します。その後、このエラーが発生しました。

私がこの問題を解決したのは、データベース全体を単純に削除して再作成することでした。その後、再度移行します。

0
Uriah Galang