You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel迁移文件中将decimal列的值乘以100后更新

错误原因

ALTER TABLE ... MODIFY 语法仅支持调整字段的结构定义(数据类型、精度、是否允许为空等),不能在该子句内直接对字段值做算术运算,你写的语句把数据更新逻辑和结构修改逻辑混在了一起,完全不符合SQL语法规范,自然无法生效。

正确实现方案

必须拆分两步执行,注意顺序不能乱:先更新存量数据,再修改字段结构,避免提前调整字段精度导致小数截断、数据精度丢失。

public function up()
{
    // 1. 批量更新存量数据:将所有`number`列的值乘以100
    DB::statement('UPDATE users SET number = number * 100');

    // 2. 修改`number`列的结构为目标配置:Decimal(11,4)、允许为null
    Schema::table('users', function (Blueprint $table) {
        $table->decimal('number', 11, 4)->nullable()->change();
    });
}

注意:调用change()方法修改字段前,必须先安装doctrine/dbal扩展包,否则Laravel无法识别字段修改逻辑。如果不想安装该依赖,也可以直接用原生SQL完成结构修改,替换第二步的Schema代码即可:

DB::statement('ALTER TABLE users MODIFY number DECIMAL(11,4) NULL');

如果需要编写对应的回滚逻辑,反向操作即可:先把number列的值除以100还原,再把字段结构改回原来的精度、非空配置。

内容的提问来源于stack exchange,提问作者user18286913

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:18:28