我尝试在迁移中添加外键约束。出于某种原因,当我将它设置为可空时,它确实有效,但当我使它不可为空时它不起作用。为什么会发生这种情况,我该如何解决?
这确实有效:
Schema::create('role_user', function (Blueprint $table){
$table->increments('id');
$table->integer('role_id')->unsigned()->index()->nullable();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('set null');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
$table->timestamps();
});
抛出异常:
Schema::create('role_user', function (Blueprint $table){
$table->increments('id');
$table->integer('role_id')->unsigned()->index();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('set null');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
$table->timestamps();
});
在制定这些约束之前,角色和用户表都已经过了。我希望它们不可为空(所以必须填写)。错误:
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table role_user add constraint role_user_role_id_foreign foreign key (role_id) references roles (id) on delete set null)
答案 0 :(得分:3)
迁移按照您在文件名中指定的顺序进行。也许您的角色表在运行此迁移时尚未创建,并且您的数据库抱怨尝试引用(尚未)不存在的表中的字段?
例如: 2016_03_27_0000_first 将在 2016_03_28_0000_second
之前执行更新:添加了解决方案。
我注意到你有#34; onDelete('设置null')"对于您尝试设置为非可空的字段。如果角色被删除,这也会导致问题,因为它会尝试将值设置为null。
您应该将两个外键都设置为:
->onDelete('cascade')
这样一来,如果用户或角色被删除,任何与它们相关的关联也会自动被删除,而不是简单地设置为空或左转。
干杯