如何通过Laravel迁移实现新增列、复制数据并更新原有列数据
Laravel生产环境价格调整迁移方案
完全可以通过Laravel的Migration实现全部需求,单份迁移文件即可完成结构变更+数据更新的所有操作,全程无需删表,适配生产环境使用。
操作步骤
- 生成迁移文件
执行如下Artisan命令生成迁移文件,将命令中你的表名替换为实际业务表名:
php artisan make:migration add_old_price_and_update_price_to_你的表名_table
- 编写迁移逻辑
打开生成的迁移文件(位于database/migrations/目录下),替换为如下代码,注意替换你的实际表名,且old_price字段的类型、长度要和原有price字段完全一致,避免精度丢失:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\DB; return new class extends Migration { public function up() { // 第一步:新增old_price字段 Schema::table('你的实际表名', function (Blueprint $table) { // 示例为decimal(8,2),请和你原有price字段配置保持完全一致 $table->decimal('old_price', 8, 2)->after('price'); }); // 事务包裹数据操作,出错自动回滚避免脏数据 DB::transaction(function () { // 第二步:备份原有price到old_price DB::table('你的实际表名')->update([ 'old_price' => DB::raw('`price`') ]); // 第三步:price值乘以5更新 DB::table('你的实际表名')->update([ 'price' => DB::raw('`price` * 5') ]); }); } public function down() { // 回滚时自动恢复原有价格 DB::transaction(function () { DB::table('你的实际表名')->update([ 'price' => DB::raw('`old_price`') ]); }); // 删除临时备份字段 Schema::table('你的实际表名', function (Blueprint $table) { $table->dropColumn('old_price'); }); } };
- 执行迁移
先在测试环境验证迁移逻辑正常后,在生产环境执行如下命令完成变更:
php artisan migrate
后续清理说明
确认新价格运行正常需要删除old_price字段时,单独生成删字段的迁移即可:
php artisan make:migration drop_old_price_from_你的表名_table
在迁移文件的up方法中编写删除字段逻辑,执行迁移即可完成清理。
生产环境注意事项
- 执行迁移前务必做好全量数据库备份
- 若表数据量超过10万条,建议在业务低峰期执行迁移,避免锁表影响正常请求
内容的提问来源于stack exchange,提问作者R0KKET
相关产品推荐
相关产品推荐

