首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel雄辩地创建使用自动增量的复合键

问Laravel雄辩地创建使用自动增量的复合键
EN

Stack Overflow用户
提问于 2015-07-30 21:11:39
回答 1查看 1.9K关注 0票数 4

我有一个像下面这样的迁移

代码语言:javascript
复制
        $table->increments('id');
        $table->integer('order_num');
        $table->timestamps();

主键应该是id和order_num的组合。如果我把下面的代码,它说我试图添加2个主键(因为增量也是一个主键)。有没有办法告诉雄辩说我想把这两件事结合在一起

代码语言:javascript
复制
        $table->primary(['course_id', 'order_num']);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 21:46:07

我假设您使用的是MySQL。

首先,默认的MySQL engine InnoDB不允许复合主键,其中一个字段是自动增量。允许这样做的引擎是MyISAM,所以您需要做的第一件事就是更改表的引擎。

可以通过在表定义中添加以下内容来做到这一点:

代码语言:javascript
复制
$table->engine = 'MyISAM';

您需要解决的下一个问题是,Laravel的模式构建器假设,您设置为自动增量的列是您的主键。这就是为什么您要获得关于已经存在的主键的错误-- Laravel已经将id字段作为主键。

要解决这个问题,需要将id字段声明为普通整数列,定义所有其他列,并在最后声明复合主键。看起来可能是这样的:

代码语言:javascript
复制
$table->integer('id');
$table->integer('order_num');
$table->timestamps();
$table->primary(['course_id', 'order_num']);

通过这种方式,您已经创建了一个复合主键。唯一缺少的是id列上的自动增量属性。Laravel的模式构建器没有提供修改现有列的方法,这就是为什么需要运行原始SQL查询的原因。您需要的查询是:

代码语言:javascript
复制
DB::statement('ALTER TABLE my_table MODIFY id INTEGER NOT NULL AUTO_INCREMENT');

总而言之,迁移的up()方法可能如下所示:

代码语言:javascript
复制
public function up()
{
  Schema::create('my_table', function (Blueprint $table) {
    $table->engine = 'MyISAM';

    $table->integer('id');
    $table->integer('order_num');
    $table->timestamps();
    $table->primary(['course_id', 'order_num']);
  });

  DB::statement('ALTER TABLE my_table MODIFY id INTEGER NOT NULL AUTO_INCREMENT');
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31734127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档