BigQuery执行INSERT填充新增空列无报错无数据问题求助
问题原因
INSERT语句的作用是向表中插入全新的行,不会修改表中已存在的行数据。你执行的INSERT语句没有报错,实际是插入了21868条新记录——这些新记录只有TEST_INSERT_VALUES_FROM_QUERY字段有查询返回的值,其余字段全部为空;表中原有的21868条记录的新增列不会被INSERT语句修改,自然一直是空值。你可以先查询全表总行数,会发现现在表行数已经是原来的2倍。
修复步骤
- 先清理之前错误INSERT产生的冗余脏数据,执行前先把条件里的主键字段替换成你表中实际非空的唯一业务字段(比如流程ID、主键ID):
-- 先查询确认要删除的是冗余空行,再执行DELETE SELECT * FROM `cpj._cad_processo_copy` WHERE TEST_INSERT_VALUES_FROM_QUERY IS NOT NULL AND 你的表非空主键/业务字段 IS NULL; -- 确认查询结果全是之前插入的空行后再执行删除 DELETE FROM `cpj._cad_processo_copy` WHERE TEST_INSERT_VALUES_FROM_QUERY IS NOT NULL AND 你的表非空主键/业务字段 IS NULL;
- 用
UPDATE JOIN语法给已有行的目标列赋值,强烈建议先开事务,验证结果正确再提交,避免误改全表数据:
-- 开启事务,执行错了可以回滚 BEGIN; -- 关联更新目标列 UPDATE `cpj._cad_processo_copy` pro LEFT JOIN `cpj.tab_materia` mat ON pro.materia = mat.codigo SET pro.TEST_INSERT_VALUES_FROM_QUERY = mat.descricao; -- 抽样查询验证更新结果 SELECT materia, TEST_INSERT_VALUES_FROM_QUERY FROM `cpj._cad_processo_copy` LIMIT 100; -- 验证结果正确执行COMMIT提交,结果不对执行ROLLBACK回滚 -- COMMIT; -- ROLLBACK;
补充说明
如果你用的是不支持UPDATE JOIN的SQL引擎(比如部分版本的Hive),可以用MERGE语法或者覆盖写表的方式实现,逻辑核心都是匹配原有行的关联关系,再给对应列赋值,不要用INSERT来给已有行填值。
内容的提问来源于stack exchange,提问作者Comune
相关产品推荐
相关产品推荐

