批量更新时,decimal类型,生成sql语句在mysql中执行会存在精度丢失 返回

SqlSugar 沟通中
1 344


UPDATE  `pl_product_mer_price` S    INNER JOIN             (

SELECT N'08dd7be75ac7456a8d7d33f4a0d765d9_80000027_100002218' AS `id`,1998 AS `price`,0 AS `is_loss`,0 AS `loss_type`,'2026-06-22 16:53:11.000' AS `update_time`,N'孙凯' AS `update_name`,N'd6c0c2a1-1175-4ceb-8c86-9a4d0d1e8c5a' AS `update_user_id`

UNION ALL

SELECT N'08dd7be75ac7456a8d7d33f4a0d765d9_80000027_100002105' AS `id`,0.999 AS `price`,1 AS `is_loss`,1 AS `loss_type`,'2026-06-22 14:50:31.000' AS `update_time`,N'章杰' AS `update_name`,N'19fcd43f-771d-49c7-9d7b-a11d310d89f3' AS `update_user_id`

           ) T ON S.`id`=T.`id`

                  SET S.`price`=T.`price`,S.`is_loss`=T.`is_loss`,S.`loss_type`=T.`loss_type`,S.`update_time`=T.`update_time`,S.`update_name`=T.`update_name`,S.`update_user_id`=T.`update_user_id` ;



如上例子,1998在执行语句后变成了999.999,


AI分析结果:


MySQL 必须为 UNION 所有分支的 price 列推断出统一类型:

0.999 有 3 位小数 → MySQL 推断为 DECIMAL(4,3) 或 DECIMAL(5,3)

如果 MySQL 再与目标列 pl_product_mer_price.price(很可能是 DECIMAL(5,2))做类型协调,派生列可能被收窄为 DECIMAL(5,2)

DECIMAL(5,2) 的最大值 = 999.99

1998 赋值到这个派生列时 → 被静默截断为 999.99(非严格模式下)



MySQL 必须为 UNION 所有分支的 price 列推断出统一类型:

0.999 有 3 位小数 → MySQL 推断为 DECIMAL(4,3) 或 DECIMAL(5,3)

如果 MySQL 再与目标列 pl_product_mer_price.price(很可能是 DECIMAL(5,2))做类型协调,派生列可能被收窄为 DECIMAL(5,2)

DECIMAL(5,2) 的最大值 = 999.99

1998 赋值到这个派生列时 → 被静默截断为 999.99(非严格模式下)


热忱回答1