SQLSTATE [HY000]: General error: 1005 Can't create table-Laravel 4

je reçois cette erreur quand je fais php artisan migrate. 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)

concerts de migration

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 De Concert

<?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
demandé sur Antonio Carlos Ribeiro 2014-01-08 19:02:00

6 réponses

Vous devez d'abord créer la table, puis de 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 bands table devrait migrer en premier, puisque le gigs est le référencement.

18
répondu Antonio Carlos Ribeiro 2014-01-08 15:23:55

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

dans le bas de l' Laravel Schéma docs:

Note: lors de la création d'une clé étrangère qui renvoie à un entier incrémentant, n'oubliez pas de toujours faire la colonne de la 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.

13
répondu Andrew 2015-04-29 02:17:01

pour ceux que les autres réponses n'aident pas, la même erreur se produit aussi quand vous essayez d'utiliser 'SET_NULL' action sur la colonne non nullable.

3
répondu Kamoris 2016-08-06 08:51:53

Comme dit par André en faisant référence sur le tableau comme ceci:

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

ça devrait marcher.

1
répondu David Kruger 2016-12-05 15:23:06

il semble qu'il s'agisse d'une erreur générale liée à la clé étrangère. Pour moi je l'ai eu quand j'ai changé les arguments dans l' references et on méthodes. J'ai eu:

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

au lieu de:

$table->foreign('user_id')->references('id')->on('users');
0
répondu ajon 2017-02-05 05:21:50

je viens de corriger ce problème en faisant pointer vers Laravel que le champ est unique en utilisant 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();
        });

table 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
répondu Abdelsalam Shahlol 2018-05-12 13:12:43