Bonjour,

Voila je rencontre un petit problème avec mon code.
Je veux utiliser un champ "key" dans ma base de données comme clé étrangère mais lorsque je lance la commande

php artisan migrate

je reçois un message d'erreur

 [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint users_role_key_foreign foreign key (`role_key`) references `role` (`key`) on delete restrict on update restrict)

voila une partie de mon code :

ma table users

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

ma table role

Schema::create('role', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('key')->unique();
            $table->string('title')->unique();
            $table->timestamps();
        });

et mon fichier add_foreign_key

 Schema::table('users', function(Blueprint $table) {
            $table->foreign('role_key')->references('key')->on('role')
                ->onDelete('restrict')
                ->onUpdate('restrict');
        });

je ne comprend pas d'où vient mon problème, ma BDD est bien en InnoDB.
merci d'avance pour votre aide

10 réponses


Alexandre #lbac
Réponse acceptée

Parce que clé est défini comme unique mais pas comme uné cle primaire

Tu dois utiliser la méthode unsigned() sur ta clé étrangère :

$table->integer('key')->unsigned()->index();

Et elle ne doit pas forcément être unique. En règle générale pas du tout même.

je viens de m'apercevoir que je n'avait pas mis le bon morceau de code.
j'ai bien unsigned() mais pas index().. c'est important ?

table users

$table->integer('role_key')->unsigned();

non c'est bon c'est tout ce que tu as à faire ;)

Alors je ne comprends pas pourquoi j'obtiens cette erreur..

En revanche, si je met 'id' en clé étrangère, ça fonctionne très bien.

Ha pardon, c'est normale, une clé étrangère fait référence à un identifiant unique

meme si j'ai défini 'key' comme unique, ça ne fonctionnera pas ?

Merci pour ton aide, je vais revoir ma logique afin de contourner mon problème.