联表插入SQL报PROD_INTRO_DT截断警告,日期值错存入PROD_CAT_CD列
联表插入SQL字段错配导致类型截断问题修复
INSERT ... SELECT 语句的字段匹配完全依赖位置顺序一一对应,不会自动按字段名匹配,本次异常就是典型的顺序错配问题
问题定位
对比INSERT子句声明的目标列顺序、以及SELECT子句实际返回的字段顺序,可直接定位错位点:
- INSERT声明的目标列顺序依次为:
PROD_ID→PROD_NM→PROD_SKU_NO→PROD_CAT_CD→PROD_PACKAGE_SIZE_NO→PROD_INTRO_DT - 原代码SELECT返回的字段顺序依次为:
c.PROD_ID→c.PROD_NM→c.PROD_SKU_NO→c.PROD_INTRO_DT→s.PROD_PACKAGE_SIZE_NO→s.PROD_CAT_CD
错位关系:
- 第4个目标列
PROD_CAT_CD本该存分类码,实际写入了来自ods_product的日期字段PROD_INTRO_DT - 第6个目标列
PROD_INTRO_DT本该存日期值,实际写入了来自ods_sale_large的分类码字段PROD_CAT_CD
这种错位直接导致两个结果:日期字符串被存入分类码列,短长度的分类码字符串被存入日期类型的PROD_INTRO_DT列,触发类型转换/长度截断警告。
修复代码
调整SELECT子句的字段顺序,使其与INSERT声明的目标列顺序完全对齐,修正后的可执行SQL如下:
INSERT INTO `goac`.`product` (`PROD_ID`, `PROD_NM`, `PROD_SKU_NO`, `PROD_CAT_CD`, `PROD_PACKAGE_SIZE_NO`, `PROD_INTRO_DT`) SELECT DISTINCT c.PROD_ID, c.PROD_NM, c.PROD_SKU_NO, s.PROD_CAT_CD, -- 对齐PROD_CAT_CD目标列 s.PROD_PACKAGE_SIZE_NO, c.PROD_INTRO_DT -- 对齐PROD_INTRO_DT日期目标列 FROM ods_product AS c JOIN ods_sale_large AS s ON s.PROD_NM = c.PROD_NM;
避坑提示
- 编写联表插入逻辑时,不要凭字段名的相似性默认顺序匹配,写完后逐行核对目标列与SELECT返回字段的顺序对应关系
- 可在SELECT中为源字段设置与目标列完全一致的别名,后续代码审计、问题排查时能快速发现错配问题
内容的提问来源于stack exchange,提问作者Logan Kidd
相关产品推荐
相关产品推荐

