当我做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');
}
}
答案 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,但其他人可能会遇到此问题:
的底部注意:创建引用递增整数的外键时,请记住始终使外键列无符号。
在迁移文件中创建表时,您可以通过$table->integer('user_id')->unsigned();
执行此操作。
花了几分钟才意识到发生了什么。
答案 2 :(得分:3)
对于那些其他答案没有帮助的人,当您尝试在非可空列上使用'SET_NULL'
操作时,同样的错误也会抛出。
答案 3 :(得分:1)
答案 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)
这似乎是一般的外键问题错误。对我来说,当我在references
和on
方法中切换参数时,我得到了它。我有:
$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