Quelqu'un peut-il m'aider à résoudre ce problème?
Il y a 3 tables avec 2 clés étrangères:
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();
});
Erreur après l'exécution de la migration:
[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")
Dans le cas de clés étrangères, les champs référencé et référencé doivent avoir exactement le même type de données.
Vous créez les champs id
dans users
et firms
sous la forme signed integers. Toutefois, vous créez les deux clés étrangères sous la forme unsigned integers. Par conséquent, la création des clés échoue.
Vous devez soit ajouter la clause unsigned
aux définitions du champ id
, soit supprimer la clause unsigned
des champs de clé étrangère.
De plus, lors de la déclaration de clés étrangères dans laravel, toutes les tables auxquelles vous faites référence doivent figurer en haut. Dans ce cas, vous pouvez utiliser le modificateur "-> unsigned ()" ..
La plupart du temps, ce type d'erreur se produit en raison de l'incompatibilité de datatype sur les deux tables.
Les tables de clé primaire et étrangère doivent utiliser le même type de données et la même option.
Par exemple:
utilisateurs
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
ordres
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');
});
Dans l'exemple ci-dessus, j'essaie d'assigner une clé étrangère à la table users à partir de la table order, mais j'ai bigInteger datatable dans la table order alors que je suis dans la table user, j'ai un entier simple. C'est pourquoi il a généré ce genre d'erreur.
De même, si vous avez utilisé les options unsigned (), nullable () etc avec une clé primaire ou étrangère, vous devez les utiliser aux deux endroits.
Cela se produit lorsque vous testez votre application laravel et que vous avez utilisé une instance de MySQL dans vos tests, soumise aux migrations de bases de données.
Avant d'exécuter le test, mes migrations fonctionnent correctement. Puis j'ai rencontré cette erreur.
J'ai résolu ce problème en supprimant simplement la base de données entière et en la recréant. Puis migrez à nouveau.