基于非主键input_street合并tempTable至inputTable的MySQL实现问题
基于非主键
input_street的CSV数据合并方案 你当前的SQL仅能处理新增场景,完全没覆盖「已有input_street且其他列变更时更新」的核心需求。要实现新增+更新二合一的合并逻辑,得用对应数据库的「UPSERT」语法,下面分主流数据库给出具体实现:
MySQL 实现步骤
第一步:给目标表加唯一约束
因为要基于input_street判断数据是否存在,必须先给inputTable添加唯一键:
ALTER TABLE inputTable ADD UNIQUE KEY idx_input_street (input_street);
第二步:执行UPSERT逻辑
用INSERT ... ON DUPLICATE KEY UPDATE完成合并,同时跳过无变更的冗余操作:
INSERT INTO inputTable (file_number, input_street, col1, col2, ...) SELECT -- 已有数据沿用原主键,新数据生成UUID IF(it.file_number IS NOT NULL, it.file_number, UUID()) AS file_number, tt.input_street, tt.col1, tt.col2, -- 列出所有需要同步的列 ... FROM temp_table tt LEFT JOIN inputTable it ON tt.input_street = it.input_street -- 仅处理新增行,或已有行但数据发生变化的情况 WHERE it.file_number IS NULL OR (it.col1 <> tt.col1 OR it.col2 <> tt.col2 OR ...); -- 列出所有需检查变更的非主键列 ON DUPLICATE KEY UPDATE -- 更新除主键和input_street外的所有列 col1 = VALUES(col1), col2 = VALUES(col2), ...;
PostgreSQL 实现步骤
第一步:加唯一约束
同样先给inputTable添加唯一约束:
ALTER TABLE inputTable ADD UNIQUE (input_street);
第二步:用MERGE语句实现
PostgreSQL的MERGE语法逻辑更直观:
MERGE INTO inputTable it USING temp_table tt ON it.input_street = tt.input_street WHEN MATCHED AND (it.col1 <> tt.col1 OR it.col2 <> tt.col2 OR ...) THEN -- 仅当数据变更时执行更新 UPDATE SET col1 = tt.col1, col2 = tt.col2, ... -- 列出其他需要更新的列 WHEN NOT MATCHED THEN -- 新数据插入,生成UUID作为主键 INSERT (file_number, input_street, col1, col2, ...) VALUES (UUID(), tt.input_street, tt.col1, tt.col2, ...);
必做收尾操作
每次合并完成后,建议清空临时表,避免下次上传重复处理旧数据:
TRUNCATE TABLE temp_table;
内容的提问来源于stack exchange,提问作者Usman Khalid Mian
相关产品推荐
相关产品推荐

