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');
}
}
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.
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.
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.
Comme dit par André en faisant référence sur le tableau comme ceci:
$table->integer('user_id')->unsigned();
ça devrait marcher.
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');
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');
});