更新导入的外部表异常:更新行数远超源表行数求助
问题原因与解决建议
核心原因
table_2更新行数远超table_1数据量的主要原因是table_2中存在违反(user_id, game_date)唯一约束的重复记录:
- 虽然table_2定义了
table_2_uniq唯一约束,但可能在外部数据导入时,约束被临时禁用、或者分区表的约束未被正确验证,导致同一个(user_id, game_date)组合对应多行数据。 - 当table_1的一行数据匹配到table_2中同一
(user_id, game_date)的多行时,这些多行都会被更新,最终更新行数超过table_1的2700行。
另外你的更新语句存在两处字段拼写错误:
b.slot_wager应为b.s_wager(table_1中对应字段是s_wager)wager_batch_id应为w_batch_id(table_2中对应字段是w_batch_id)
这些错误可能导致更新值异常,但不会直接引发行数超标的问题。
解决步骤
1. 排查table_2的重复记录
执行以下SQL找出违反唯一约束的重复行:
SELECT user_id, game_date, COUNT(*) AS row_count FROM table_2 GROUP BY user_id, game_date HAVING COUNT(*) > 1;
2. 清理重复数据
如果存在重复行,根据业务规则保留有效数据(例如保留s_update_date最新的一行,删除其他):
WITH duplicate_rows AS ( SELECT user_id, game_date, s_update_date, ROW_NUMBER() OVER (PARTITION BY user_id, game_date ORDER BY s_update_date DESC) AS rn FROM table_2 ) DELETE FROM table_2 USING duplicate_rows WHERE table_2.user_id = duplicate_rows.user_id AND table_2.game_date = duplicate_rows.game_date AND table_2.s_update_date = duplicate_rows.s_update_date AND duplicate_rows.rn > 1;
3. 验证并修复唯一约束
执行以下命令验证约束有效性,确保后续数据不会再出现重复:
ALTER TABLE table_2 VALIDATE CONSTRAINT table_2_uniq;
如果命令报错,说明仍有未清理的重复数据,需重新检查并处理。
4. 修正更新语句
简化并修正字段拼写错误后的更新语句:
UPDATE table_2 SET s_wager = b.s_wager, s_update_date = b.lst_update, w_batch_id = null FROM table_1 b WHERE table_2.user_id = b.user_id AND table_2.game_date = b.dt;
内容的提问来源于stack exchange,提问作者Vaso Miruashvili
相关产品推荐
相关产品推荐

