You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于非主键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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:04:51