-- ===================================================================== -- V23 · 修复历史遗留的驼峰列名(后台产品页面 Unknown column 报错) -- --------------------------------------------------------------------- -- 背景: -- V19(面板 P2 迁移)建列时把 completionMode 直接当作列名写入 product_property, -- 而 MyBatis-Plus 默认把实体字段 completionMode 映射为下划线形式 completion_mode, -- 于是实体查询/写入时提示 Unknown column 'completion_mode' in 'field list', -- 后台「产品中心 - 产品详情 / 物模型」接口 500。 -- 注:V22 已把 completion_mode 的权威归属判定为 product_action 维度, -- product_property 上的同名列属于历史兼容,保留但统一为下划线命名。 -- -- 处理:把 product_property.completionMode 重命名为 completion_mode -- 幂等,可重复执行;三种情形分别处理 -- 1) 仅有驼峰列 -> 直接 RENAME -- 2) 两列都存在 -> 先回填旧列非空值到新列,再删除旧列 -- 3) 仅有下划线列 -> 无需处理 -- -- 无存储过程、无 DELIMITER(MySQL batch 管道模式下 DELIMITER 失效,见 V22 说明)。 -- ===================================================================== SET @has_old = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='product_property' AND BINARY COLUMN_NAME = 'completionMode'); SET @has_new = (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='product_property' AND BINARY COLUMN_NAME = 'completion_mode'); -- 情形 1:只有驼峰列 -> 重命名;情形 2:两列都在 -> 回填旧值(旧列随后单独删除) SET @ddl = (SELECT IF(@has_old = 0, 'SELECT 1', IF(@has_new = 0, 'ALTER TABLE product_property RENAME COLUMN completionMode TO completion_mode', 'UPDATE product_property SET completion_mode = completionMode WHERE completion_mode IS NULL AND completionMode IS NOT NULL'))); PREPARE st FROM @ddl; EXECUTE st; DEALLOCATE PREPARE st; -- 情形 2 收尾:删除已回填的驼峰列(情形 1 不触发) SET @ddl = (SELECT IF(@has_old = 1 AND @has_new = 1, 'ALTER TABLE product_property DROP COLUMN completionMode', 'SELECT 1')); PREPARE st FROM @ddl; EXECUTE st; DEALLOCATE PREPARE st;