誰かがこの問題を解決するのを手伝ってくれますか?
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")
外部キーの場合、参照フィールドと参照フィールドはまったく同じデータ型である必要があります。
id
とusers
の両方にfirms
フィールドをsigned integerとして作成します。ただし、両方の外部キーをnsigned integerとして作成するため、キーの作成は失敗します。
unsigned
句をid
フィールド定義に追加するか、外部キーフィールドからunsigned
句を削除する必要があります。
ほとんどの場合、この種のエラーは、両方のテーブルで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()などのオプションを使用した場合は、両方の場所で同じものを使用する必要があります。
この回答は、それ以前の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();
です
予想されるincrements
はinteger('column_name')->unsigned();
などです。
4)Remnants:このエラーが発生しても、テーブルは移行されず、移行されますが、外部キー列は設定されず、 _migration table
_に追加されないため、_php artisan migrate:reset
_を実行すると、障害のあるテーブルを除く他のテーブルが削除されるため、エラーを回避するために障害のあるテーブルを手動で削除することをお勧めします。
5)Order:これは多くの場合、このエラーの最も一般的な原因です。referenced
であるテーブルは、_reference table
_それ以外の場合、職人は外部キーを統合する場所を見つけられません。移行プロセスの順序を確認するには、移行ファイルの名前を変更します。例:
2014_10_12_000000_create_users_table.php
_および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移行 をご覧ください。
コメントのおかげで見逃した修正について言及してください。
PHP laravel 5.8この形式で符号なし修飾子を使用
$table->unsignedBigInteger('user_id');
データベース内のすべてのテーブルを削除し、移行を再度実行します
さらに、laravelで外部キーを宣言するときは、参照しているすべてのテーブルが一番上にある必要があります。この場合、 "-> unsigned()"修飾子を使用できます。
私たちはテーブルビルです
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');
});
参照フィールドを設定し、まったく同じデータ型であるがエラーが存在する場合、日付移行ファイルをその動作だけを変更できます
これは、laravelアプリをテストし、データベース移行の対象となるテストでMySQLのインスタンスを使用した場合に発生します。
テストを実行する前に、私の移行は正常に動作します。その後、このエラーが発生しました。
私がこの問題を解決したのは、データベース全体を単純に削除して再作成することでした。その後、再度移行します。