SQLSTATE [HY000]:常规错误:1005无法创建表 - Laravel 4

时间:2014-01-08 15:02:01

标签: php laravel migration laravel-4

当我做php artisan migrate时,我收到此错误。我的迁移文件有什么问题吗?或者我的模型可能编码错误吗?但即使模型出现问题,迁移也应该有效吗?

[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)

演出

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');
        });
    }

乐队迁移

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');
        });
    }

模型乐队

<?php

class Band extends Eloquent {

    protected $primaryKey = 'band_id';

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

Model 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');
    }
}

16 个答案:

答案 0 :(得分:20)

您必须先创建表,然后创建外键:

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');
});

您的bands表应首先迁移,因为gigs正在引用它。

答案 1 :(得分:15)

虽然这不适用于OP,但其他人可能会遇到此问题:

Laravel Schema docs

的底部
  

注意:创建引用递增整数的外键时,请记住始终使外键列无符号。

在迁移文件中创建表时,您可以通过$table->integer('user_id')->unsigned();执行此操作。

花了几分钟才意识到发生了什么。

答案 2 :(得分:3)

对于那些其他答案没有帮助的人,当您尝试在非可空列上使用'SET_NULL'操作时,同样的错误也会抛出。

答案 3 :(得分:1)

正如Andrew所述,在表格中引用如下:

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

它应该有用。

答案 4 :(得分:1)

对于仍然存在此问题的用户,请确保您设置为外键的字段是主键或应该是唯一的,因为外键只能是主键或唯一字段。 参见下面的示例

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')
 });

答案 5 :(得分:1)

我遇到了类似的问题。 你必须使用 bigInteger 来解决这个问题:

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

答案 6 :(得分:0)

这似乎是一般的外键问题错误。对我来说,当我在referenceson方法中切换参数时,我得到了它。我有:

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

而不是:

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

答案 7 :(得分:0)

我刚刚通过使用unique()向Laravel指出字段唯一来解决此问题。

示例:

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();
        });

功能表:

    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');

    });

答案 8 :(得分:0)

我在配置/数据库'engine' => 'InnoDB',中将其更改为'engine' => null,,并且可以正常工作

答案 9 :(得分:0)

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

在laravel 5.8中,users_table使用bigIncrements('id')数据类型作为主键。因此,当您要引用外键约束时,band_id,stage_id列需要为unsignedBigInteger('stage_id')和band_id类型。

经理也以这种方式进行了测试。

答案 10 :(得分:0)

您可以使用

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

BigInt的数据类型为bigint(20),而整数的数据类型为int(10)。尽管这两个都是无符号整数,但“长度/值”不匹配。

答案 11 :(得分:0)

对于Laravel 6.X,请使用此格式。

$table->unsignedBigInteger('dest_id')->unsigned();

$table->foreign('dest_id')->references('id')->on('destinations')->onDelete('cascade');

答案 12 :(得分:0)

以上对我没有任何帮助! 但这确实是:我只是将整数更改为unsignedInteger

false

答案 13 :(得分:0)

更改自:

$table->unsignedInteger('user_id')->unique();

收件人:

$table->unsignedBigInteger('user_id')->unique();

为我工作

答案 14 :(得分:0)

外键必须使用unsignedInterger或unsignedBigInterger

考试:

 CreateMap<Source2, Dest3>();
            CreateMap<Source2, Dest1>()
                .ForMember(d => d.Dests3 , opt => opt.MapFrom(s => s));

答案 15 :(得分:0)

您还可以为约束的“删除时”和“更新时”属性指定所需的操作:

setState