如何在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
相关产品推荐
相关产品推荐

