用户代码
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->integer('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
$table->rememberToken();
$table->timestamps();
});
}
用户角色代码
public function up()
{
Schema::create('user_roles', function (Blueprint $table) {
$table->increments('id');
$table->string('user_role');
$table->timestamps();
});
}
SQLSTATE [HY000]:常规错误:1005无法创建表sms
。#sql-1718_62
(错误号:150“外键约束格式不正确”)(SQL:更改表{{1} }在删除级联上添加约束users
外键(users_role_id_foreign
)引用role_id
(user_role
)
答案 0 :(得分:0)
如果要引用外键,请不要使用
$table->integer('role_id')->unsigned();
您应该使用
$table->unsignedInteger('role_id');
这与迁移部分Laravel Migrations中的文档有关。
所以您的新语句最终看起来应该是
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->unsignedInteger('role_id');
$table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
$table->rememberToken();
$table->timestamps();
});
}
编辑:
在作者添加 user_role 表的迁移代码后,问题很明显。
作者引用的表称为 user_roles ,而不是外键迁移 user_role 中提到的表。
这是适用于 users 表的迁移。
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->unsignedInteger('role_id');
$table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade'); // change this line
$table->rememberToken();
$table->timestamps();
});
}
命名与Laravel命名约定有关,其中所有表均以复数形式命名,而所有模型均以单数形式命名。
编辑2:
OP提到他的迁移顺序错误,这是无法正常工作的原因。
users 表是在 user_roles 表之前创建的。这就是外键导致错误的原因。
希望这对您有所帮助!如果您还有其他问题,请告诉我!
答案 1 :(得分:0)
这个问题是晦涩的。如果引用列和外键列的类型不同,也会发生这种情况。
例如:如果外键列为SMALLINT(5)
未签名,而引用列为INT(10)
未签名。
答案 2 :(得分:0)
在此处输入您的代码:
$table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
您正在引用 user_role 表,但是您没有此表,因此具有 user_roles 表,因此请将user_role改为user_roles
$table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade');
希望这可以解决您的问题
答案 3 :(得分:0)
表名不正确。当您创建名为user_roles
的表时,它应该是user_role
而不是user_roles
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->integer('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade');
$table->rememberToken();
$table->timestamps();
});