Bonjour,
Je suppose que cette erreur a été rencontré par d'autres personnes mainte fois, néanmois je n'ai pas trouvé la solution sur Internet.
J'essaie de créer deux clés étrangères mais cela ne fonctionne pas. J'ai l'impression que déja, il ne me crée pas d'index alors que je lui demande de le faire
Voici mon code
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateStudentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('students', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('first_name', 75);
$table->string('last_name', 75);
$table->integer('user_id')->index()->unsigned();
$table->integer('class_id')->nullable()->index()->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('class_id')->references('id')->on('classes')->onDelete('set null');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('students');
}
}
Et l'erreur, c'est tout simplement :
Impossible d'ajouter des contraintes d'index (SQL : Alter table 'students' add_constraint 'students_user_id_foreign' foreign key ('user_id') references 'users' ('id') on delete cascade)
Comme dit plus haut, j'ai l'impression qu'il ne me génère pas d'index. Lorsque le script est executé, les champs sont crées mais pas les index. Du coup la contrainte, j'ai pas l'impression qu'il puisse la faire.
J'ai finalement trouvé la solution via le chat Discord.
La table 'users' de Laravel était en MyISAM et une clé étrangère y faisait référence.
Problème résolu :)
Solution :Pensez à changer le moteur de stockage de toutes les tables en InnoDB (même les tables des champs pointés par la clé étrangère)
Dans chaque migration,
$table->engine = "InnoDB"
J'ai personnellement, après cela, supprimé toutes les tables manuellement (même la table 'migrations') et relancé la commande
php artisan migrate
J'éspère que cela vous aidera.