运行Laravel 4迁移时出现SQL 1005错误

5

我正在使用 Laravel 4 的模式生成器尝试设置一个带有对 users 表的外键关联的 comments 表,如下所示:

Schema::create('comments', function(Blueprint $table)
{
    $table->increments('id');
    $table->integer('user_id');
    $table->text('body');
    $table->timestamps();

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

但是当我运行迁移时,出现了以下错误信息:
[Exception]
SQLSTATE[HY000]: General error: 1005 Can't create table 'streamr.#sql-16fc_89' (errno: 150)
(SQL: alter table `comments` add constraint comments_user_id_foreign foreign key (`user_id`) references `users` (`id`)) (Bindings: array ())

据我所知,这是因为“用户(users)”表的“id”列是“int(10)”,而“$table->integer('user_id')”创建一个“int(11)”列,导致外键失败,因为列类型不兼容。然而,当我尝试设置正在创建的整数列的长度时,它不起作用:
$table->integer('user_id', 10);

有没有什么方法可以解决这个问题?在Laravel的模式构建器中,为主键构建int(10)列,并不兼容integer列,这对我来说很奇怪 :/。另外,我也确认了表格是InnoDB引擎,而且确实如此。
1个回答

4

$table->unsignedInteger('id') 会生成一个无符号整数,用于设置外键时需要无符号整数类型。

可以尝试这样修改:

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

从 Laravel 文档 (http://laravel.com/docs/schema#foreign-keys):

注意: 在创建一个参照自增整数的外键时,要记得把外键列设为无符号。


如果您使用像 $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); 这样的代码,那么它可能需要将外键列设置为可空:$table->unsignedInteger('user_id')->nullable(); - Janaka R Rajapaksha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接