web-dev-qa-db-fra.com

SQLSTATE [HY000]: Erreur générale: 1005 Impossible de créer une table - Laravel 4

Je reçois cette erreur lorsque je fais migrer un artisan php. Quelque chose ne va pas dans mes fichiers de migration? Ou est-il possible que mes modèles soient mal codés? Mais les migrations devraient fonctionner même s'il y a quelque chose qui ne va pas dans les modèles?

[Exception]                                                                  
  SQLSTATE[HY000]: General error: 1005 Can't create table 'festival_aid.#sql-  
  16643_2033' (errno: 150) (SQL: alter table `gigs` add constraint gigs_band_  
  id_foreign foreign key (`band_id`) references `bands` (`band_id`) on delete  
   cascade) (Bindings: array (                                                 
  ))

[PDOException]                                                               
  SQLSTATE[HY000]: General error: 1005 Can't create table 'festival_aid.#sql-  
  16643_2033' (errno: 150)

migration des concerts

public function up()
    {
        Schema::create('gigs', function($table)
        {
            $table->increments('gig_id');

            $table->dateTime('gig_startdate');

            $table->integer('band_id')->unsigned();
            $table->integer('stage_id')->unsigned();

            $table->foreign('band_id')
                ->references('band_id')->on('bands')
                ->onDelete('cascade');

            $table->foreign('stage_id')
                ->references('stage_id')->on('stages')
                ->onDelete('cascade');
        });

    public function down()
    {
        Schema::table('gigs', function($table)
        {
            Schema::drop('gigs');
            $table->dropForeign('gigs_band_id_foreign');
            $table->dropForeign('gigs_stage_id_foreign');
        });
    }

migration des bandes

public function up()
    {
        Schema::create('bands', function($table)
        {
            $table->increments('band_id');

            $table->string('band_name');
            $table->text('band_members');
            $table->string('band_genre');
            $table->dateTime('band_startdate');
        });
    }

    public function down()
    {
        Schema::table('bands', function(Blueprint $table)
        {
            Schema::drop('bands');
        });
    }

Bande Modèle

<?php

class Band extends Eloquent {

    protected $primaryKey = 'band_id';

    public function gig()
    {
        return $this->hasOne('Gig', 'band_id', 'band_id');
    }
}

Modèle Gig

<?php

class Gig extends Eloquent {
    protected $primaryKey = 'gig_id';

    public function gig()
    {
        return $this->belongsTo('Band', 'band_id', 'band_id');
    }

    public function stage()
    {
        return $this->belongsTo('Stage', 'stage_id', 'stage_id');
    }
}
10
Gilko

Vous devez d'abord créer la table, puis créer les clés étrangères:

Schema::create('gigs', function($table)
{
    $table->increments('gig_id');

    $table->dateTime('gig_startdate');

    $table->integer('band_id')->unsigned();
    $table->integer('stage_id')->unsigned();
});

Schema::table('gigs', function($table)
{
    $table->foreign('band_id')
        ->references('band_id')->on('bands')
        ->onDelete('cascade');

    $table->foreign('stage_id')
        ->references('stage_id')->on('stages')
        ->onDelete('cascade');
});

Et votre table bands doit migrer en premier, puisque gigs le référence.

19

Bien que cela ne s'applique pas à OP, d'autres pourraient avoir ce problème:

Au bas de la Laravel Schema Docs :

Remarque: lors de la création d'une clé étrangère faisant référence à un entier incrémentiel, n'oubliez pas de toujours laisser la colonne de clé étrangère non signée.

Vous pouvez le faire via $table->integer('user_id')->unsigned(); lors de la création de votre table dans le fichier de migration.

Il m'a fallu quelques minutes pour comprendre ce qui se passait.

15
Andrew

Pour ceux que les autres réponses ne permettent pas de résoudre, la même erreur est également générée lorsque vous essayez d'utiliser l'action 'SET_NULL' sur une colonne non Nullable.

3
Kamoris

Comme dit par Andrew en faisant la référence sur la table comme ceci:

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

Ça devrait marcher.

1
David Kruger

Cela semble être une erreur générale liée à un problème de clé étrangère. Pour moi, je l'ai eu lorsque j'ai changé les arguments dans les méthodes references et on. J'ai eu:

$table->foreign('user_id')->references('users')->on('id');

au lieu de:

$table->foreign('user_id')->references('id')->on('users');
0
ajon

Je viens de résoudre ce problème en faisant remarquer à Laravel que le champ est unique using unique().

Exemple:

Schema::create('branches', function (Blueprint $table) {
            $table->increments('id');
            /* This fields serves as foriegn key on functions 
            table and it must follow the database **key rules**
            by being unique */
            $table->string('branch_code')->unique();
            $table->string('branch_name');
            $table->string('branch_address');
            $table->timestamps();
        });

Tableau des fonctions:

    Schema::create('functions', function (Blueprint $table) {
        $table->increments('id');
        $table->string('branch_code');
        $table->string('function');
        $table->timestamps();
        //Reference to branch_code on branches table
        $table->foreign('branch_code')->references('branch_code')->on('branches');

    });
0

pour ceux qui ont toujours ce problème, assurez-vous que le champ que vous définissez comme clé étrangère est une clé primaire ou doit être unique, car une clé étrangère ne peut être qu'un champ principal ou unique. voir exemple ci-dessous

Schema::create('users', function (Blueprint $table) {
  $table->increments('id');
  $table->string('username',25)->unique();
 });

Schema::create('another_table', function (Blueprint $table) {
   $table->increments('id');
   $table->string('name', 25);
   $table->foreign('name')->references('username')->on('users')
 });
0
AddTek

J'ai changé dans config/database 'engine' => 'InnoDB', à 'engine' => null, et fonctionne

0
OCornejo