-- 揽收明细:补齐运单号/客户单号快照(幂等;列已存在则跳过) -- 对应实体 PickupOrderLine.ServiceNo / ClientNo -- 报错 Unknown column 'ServiceNo' in 'field list' 时执行本脚本 -- MySQL 5.7+ / 8.0 SET @db := DATABASE(); -- ServiceNo SET @col := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_pickup_order_line' AND COLUMN_NAME = 'ServiceNo' ); SET @sql := IF( @col = 0, 'ALTER TABLE `t_pickup_order_line` ADD COLUMN `ServiceNo` VARCHAR(64) NULL COMMENT ''运单号快照(便于列表)'' AFTER `OrderId`', 'SELECT ''skip ServiceNo'' AS msg' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ClientNo SET @col := ( SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 't_pickup_order_line' AND COLUMN_NAME = 'ClientNo' ); SET @sql := IF( @col = 0, 'ALTER TABLE `t_pickup_order_line` ADD COLUMN `ClientNo` VARCHAR(64) NULL COMMENT ''客户单号快照'' AFTER `ServiceNo`', 'SELECT ''skip ClientNo'' AS msg' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 存量行从订单表回填快照(仅空值) UPDATE `t_pickup_order_line` pl INNER JOIN `t_order` o ON o.`Id` = pl.`OrderId` SET pl.`ServiceNo` = IFNULL(NULLIF(pl.`ServiceNo`, ''), o.`ServiceNo`), pl.`ClientNo` = IFNULL(NULLIF(pl.`ClientNo`, ''), o.`ClientNo`) WHERE pl.`IsDeleted` = 0 AND (pl.`ServiceNo` IS NULL OR pl.`ServiceNo` = '' OR pl.`ClientNo` IS NULL OR pl.`ClientNo` = '');