web-dev-qa-db-fra.com

laravel errno 150 contrainte de clé étrangère mal formée

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")
7
Yrtymd

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.

15
Shadow
  • utilisateurs
  • caissier fait référence à des utilisateurs
  • étudiant parle caissier

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 ()" ..

1
Louie Guides

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.

0
Mayank Dudakiya

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.

0
Uriah Galang