我正在尝试使用Laravel 4的架构构建器为comments
表设置一个带有外键的users
表,如下所示:
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 ())
据我所知,这是因为id
表的users
列为int(10)
,$table->integer('user_id')
列为int(11)
列由于列类型不兼容而导致外键失败。但是,当我尝试设置整数列的长度时,我正在创建它不起作用:
$table->integer('user_id', 10);
有没有办法解决这个问题?我觉得很奇怪,Laravel的架构构建器会为主键构建int(10)
列,而不是使它们与integer
列兼容:/
编辑:我还确保这些表格是InnoDB,它们都是。
答案 0 :(得分:4)
$table->increments('id')
生成无符号整数。设置外键时,整数与无符号整数不兼容。
试试这个:
$table->unsignedInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')->on('users');
来自laravel docs(http://laravel.com/docs/schema#foreign-keys):
注意:创建引用递增整数的外键时,请记住始终使外键列无符号。