如何将自动增量设置为非主键?

Lui*_*uiz 2 laravel laravel-migrations laravel-schema-builder

如何设置不是创建方法主键的数据库自动增量字段?

唯一的方法是使用原始查询?

DB::statement('ALTER TABLE table CHANGE field field INT(10)AUTO_INCREMENT');

Nik*_* S. 5

没有实现这样做.但是,我在Laravel论坛上发现了这个:

Schema::table('table', function(Blueprint $t) {
    // Add the Auto-Increment column
    $t->increments("some_column");

    // Remove the primary key
    $t->dropPrimary("table_some_column_primary");

    // Set the actual primary key
    $t->primary(array("id"));
});
Run Code Online (Sandbox Code Playgroud)

这没有经过测试但应该有效.我不确定Laravel如何调用他们的主键,也许你必须首先检查它并调整dropPrimary()线路以使其工作.

  • 你好。我能够在不传递 `index_name` 的情况下删除主键。`$t->dropPrimary()`。Laravel 会自动检测特定列的主键索引的名称。我在 PostgreSQL 中使用 Laravel 5.5 (2认同)
  • 这不适用于MySQL:SQLSTATE [42000]:语法错误或访问冲突:1075错误的表定义;只能有一个自动列,必须将其定义为键` (2认同)
  • 我能够让它工作,但它需要位于 3 个不同的部分中: <pre> Schema::create('table', function(Blueprint $t) { // 添加自动增量列 $t-> increments("some_column"); // 加上除实际 PK 之外的所有其他字段 }); Schema::table('table', function(Blueprint $t) { // 删除主键 $t->dropPrimary("table_some_column_primary"); }); Schema::table('table', function(Blueprint $t) { // 设置实际主键 $t->primary(array("id")); }); </前> (2认同)

ins*_*ign 5

我觉得在迁移时做一些解决方法并不安全,所以我在模型文件中做了这个:

/**
 *  Setup model event hooks
 */
public static function boot()
{
    parent::boot();
    self::creating(function ($model) {
        $model->field_here = $model->max('field_here') + 1;
    });
}
Run Code Online (Sandbox Code Playgroud)

如果您想禁用自动增量,请在模型文件的开头添加以下内容:

public $incrementing = FALSE;
Run Code Online (Sandbox Code Playgroud)

  • 在处理并发场景时,这可能会导致不好的结果。 (4认同)