在迁移 laravel 5.1 中设置自动增量字段从 1000 开始

Posted

技术标签:

【中文标题】在迁移 laravel 5.1 中设置自动增量字段从 1000 开始【英文标题】:Set Auto Increment field start from 1000 in migration laravel 5.1 【发布时间】:2016-03-15 17:50:37 【问题描述】:

我需要从用户表中的 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();
    );

【问题讨论】:

对于 laravel 8+ 有一个 new modifier 你可以做类似 $table->id()->from(1000); 我理解这个问题 5.1 【参考方案1】:

在 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();

【讨论】:

【参考方案2】:
//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;");

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

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

以下两行:

$prefix = DB::getTablePrefix();
DB::update("ALTER TABLE ".$prefix."users AUTO_INCREMENT = 1000;");

【讨论】:

谢谢。在 laravel 8 中你可以直接使用 $table->id()->from(1000);【参考方案3】:

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

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

【讨论】:

我在迁移下粘贴了该行,它输出错误:The use statement with non-compound name 'DB' has no effect 我认为您在顶部使用 DB(使用 DB;)这就是您收到此错误的原因,只需删除它,我已经更新了我的答案看看。 这不适用于所有数据库。示例,不适用于 sqlite。 如果喜欢在 sqlite 数据库上使用它,请使用 DB::update("UPDATE SQLITE_SEQUENCE SET seq = $num WHERE name = '$table'") 其中 $num 是您新的最后一个增量编号,$table 是表。 sqlite.org/autoinc.html【参考方案4】:

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

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;');

DB::statement() 可用于执行您需要的任何一条 SQL 语句。

【讨论】:

如果我在同一个表中有许多数据类型为增量的列,例如 product_id 、 counter_id 并且我只想为 counter_id 设置起始值,这会影响 product_id 吗? 计数器在表级别定义。您不能在 mysql 中的一个表上有多个 AUTO_INCREMENT 列,所以您的要求是不可能的。【参考方案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。

请注意,如果您有要在 id 值 startId 的表中播种的值,您需要在执行这些语句之前 执行此操作。否则数据库会抛出约束冲突错误。

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

【讨论】:

是的,决定发布一个与数据库无关的答案,该答案应该可以在任何数据库引擎上使用,而不是数据库特定的黑客攻击。【参考方案6】:

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

这是php artisan migrate之后的结果

【讨论】:

感谢您的回答,但我认为您发布的答案与 Prashant 相同。 请详细说明你的答案和推测。

以上是关于在迁移 laravel 5.1 中设置自动增量字段从 1000 开始的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 迁移中设置默认的空数组

hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

如何在 Laravel 5.1 中设置 JWT Token 的过期时间

在 Laravel 5.1 配置文件中读取 Vhosts 中设置的环境变量

如何在 Laravel 迁移中设置默认 DateTime()? [复制]

Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增