在迁移 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 开始的主要内容,如果未能解决你的问题,请参考以下文章
hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?
如何在 Laravel 5.1 中设置 JWT Token 的过期时间
在 Laravel 5.1 配置文件中读取 Vhosts 中设置的环境变量