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

时间:2017-03-21 14:21:32

标签: laravel laravel-migrations laravel-schema-builder

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

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

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

4 个答案:

答案 0 :(得分:5)

没有实施这样做。但是,我在Laravel Forums发现了这一点:

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"));
});

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

答案 1 :(得分:1)

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

/**
 *  Setup model event hooks
 */
public static function boot()
{
    parent::boot();
    self::creating(function ($model) {
        $model->field_here = $model->count() + 1;
    });
}

如果要禁用自动增量,请在模型文件的开头添加:

public $incrementing = FALSE;

答案 2 :(得分:0)

当前答案不起作用,自动递增列必须是主键。我建议在插入时使用firstOrCreate以获得相同级别的唯一性(前提是您仍需要自动递增密钥)。

答案 3 :(得分:0)

Schema::table('table_name', function(Blueprint $table) {
    DB::statement('ALTER TABLE table_name ADD column_name INT NOT NULL AUTO_INCREMENT AFTER after_column_name,  ADD INDEX (column_name)'); 
});