在迁移层5.1中设置自动增量字段开始表单1000

时间:2015-12-10 07:29:56

标签: php mysql migration laravel-5.1

我需要在用户表中从1000开始我的ID,我怎么能为此创建迁移。

我目前的迁移是:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id'); // how can I start this from 1000
        $table->integer('qualification_id')->nullable();
        $table->integer('experience_id')->nullable();
    });
}

6 个答案:

答案 0 :(得分:24)

应该是这样(未经测试)。

use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

class MyTableMigration extends Migration {

     /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        $statement = "ALTER TABLE MY_TABLE AUTO_INCREMENT = 111111;";
        DB::unprepared($statement);
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
    }
}

<强>更新

//Your migrations here:
Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id')->unsigned();
    $table->integer('qualification_id')->nullable();
    $table->integer('experience_id')->nullable();
});

//then set autoincrement to 1000
//after creating the table
DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;");

答案 1 :(得分:5)

大多数表使用从下一个最大整数递增的增量。

总是可以插入一个高于当前自动增量索引的整数。然后,自动增量指数将自动跟随新值+1。

所以,如果你有一个刚刚铸造的表,你当前的索引是0,下一个键将是0 + 1 = 1.

我们想要的是一个从1000开始的主键,所以我们要做的是插入一个id值为999的记录,这样下一个插入就会变成1000个。

在代码中:

 $startId = 1000;

 DB::table('users')->insert(['id'=> $startId - 1]);
 DB::table('users')->where('id',$startId - 1)->delete();

现在你有一个空表,下一个插入ID应该是1000。

请注意,如果您有值要在表格中播种的值,其值为&lt; {/ 1}}执行这些语句之前, 之前需要执行此操作。否则,数据库将抛出约束违规错误。

这应该与数据库无关,但如果有一个数据库没有遵循这个自动增量规则,我很乐意听到它。

答案 2 :(得分:2)

迁移到创建表并从Laravel 5.5开始设置其自动增量值

    class ClassName(object):
        _variable_one = None
        _variable_two = None

        def __init__(self, var1, var2):
             # set variables
             self._variable_one = var1
             self._variable_two = var2

        def _checker(self):
             # check some relationship between _variable_one and _variable two
             # and assert it is still true, for example:
             assert self._variable_one == self._variable_two

        def do_stuff(self):
             # perform a method which changes _variable_one and _variable two
             # check your changes do not 'break' the model
             self._checker()

public function up() { Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->integer('qualification_id')->nullable(); $table->integer('experience_id')->nullable(); }); // Here's the magic \DB::statement('ALTER TABLE table_name AUTO_INCREMENT = 1000;'); } 可用于执行您需要的任何单个SQL语句。

答案 3 :(得分:2)

在Laravel 8中,您只能将from()用于MySQL / PostgreSQL:

设置自动递增字段的起始值( MySQL / PostgreSQL

$table->id()->from(...);

startingValue()方法也可以使用,但是我在文档中的任何地方都没有看到这一点。

$table->id()->startingValue(...);

它在mysql的幕后使用:

public function compileAutoIncrementStartingValues(Blueprint $blueprint)
{
    return collect($blueprint->autoIncrementingStartingValues())->map(function ($value, $column) use ($blueprint) {
        return 'alter table '.$this->wrapTable($blueprint->getTable()).' auto_increment = '.$value;
    })->all();
}

答案 4 :(得分:1)

square_matrix_multiply

我们需要添加前缀表。所以我们需要替换行

//Your migrations here:
Schema::create('users', function (Blueprint $table) {

    $table->bigIncrements('id')->unsigned();

    $table->integer('qualification_id')->nullable();

    $table->integer('experience_id')->nullable();

 });

 //then set autoincrement to 1000

 //after creating the table

 DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;");

按以下2行:

DB::update("ALTER TABLE users AUTO_INCREMENT = 1000;");

答案 5 :(得分:-4)

Prashant的方法没有问题。 但正如前面所说,不要将use DB;放在文件的顶部。

enter image description here

以下是php artisan migrate

之后的结果

And here are the results