如何在Laravel 4中将BIGINT作为自增主键使用

8
我正在尝试模仿wordpress的主键大小,即BIGINT(20),但似乎laravel没有本地函数可以实现这一点。我在laravel论坛上看到了一个页面,并得到了如下代码: $table->bigInteger('id')->primary(); 但是,当我尝试在artisan migrate期间将外键附加到该ID时,会抛出MYSQL错误: [Exception] SQLSTATE[HY000]: General error: 1005 Can't create table 'db.#sql-1730_15' (errno: 150) (SQL: alter table users add constraint users_role_id_foreign foreign key (role_id) references roles (id)) (Bindings: array()) 我应该如何正确处理或者哪里出错了?

谢谢!


2
这不是Laravel的问题,而是与外键有关。外键和它的主键必须是相同类型的列对,您可以删除主键,更改两个列的类型,然后重新设置主键。 - Loken Makwana
2个回答

28

你很可能忘记了设置你的role_id外键的类型为BIGINT(20)。这不是Laravel的问题,而是MySQL的问题。


顺便说一句,Laravel确实有一个本地函数可以做到这一点:

$this->bigIncrements('id');

这将负责使其成为 无符号自动增量主键


嗨,似乎 ->primary() 并没有将其变成自增键...也许这就是原因。现在我的问题是,我应该如何在 Laravel 中完成它? - reikyoushin
找到了该函数的本地化版本。已更新答案。 - rmobis
是的,我已经看到了(在这里看)。我正要回答我的问题,但你比我先编辑了它... 问题是错误仍然存在,即使我在用户和角色表上都使用$this->bigIncrements('id'); - reikyoushin
是的,它现在是一个原生函数,只是尚未在主网站上记录文档。它在 API 中有记录(http://laravel.com/api/class-Illuminate.Database.Schema.Blueprint.html),但还没有在文档(http://laravel.com/docs/schema)中记录。 - reikyoushin
1
哦,算了吧..我在将我的代码复制粘贴到问题中时找到了它..是的,确实是类型不匹配。我没有意识到我仍在使用 $table->unsignedInteger('role_id');,现在我已经更新为 $table->unsignedBigInteger('role_id');。非常感谢! - reikyoushin
显示剩余2条评论

4

当在某些表中使用bigInteger()并将其应用于外键时,请确保使用unsignedBigInteger()正确连接。

public function up()
{
        Schema::create('create_this_table_after_users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
           // Other Columns
        });
        Schema::table('create_this_table_after_users', function($table) {
            $table->foreign('user_id')->references('id')->on('users');
            // Other Constraints 
        });
}

Laravel 4.2文档的参考链接


1
谢谢,伙计!我一直在寻找为什么会出现这个错误 General error: 1215 Cannot add foreign key constraint - Rytis Dereskevicius
很高兴能帮到你。愉快编程! - Vipertecpro
1
哦,天啊,在 Laravel 5.8 中进行多次迁移尝试后,这真的帮了很大忙。 - wobsoriano

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