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

如何用单SQL脚本实现CSV与现有数据库表的同步?

用单SQL脚本实现CSV与数据库表的同步(UPSERT操作)

当然可以用单SQL脚本实现这种「匹配主键则更新、未匹配则插入」的同步需求(行业内通常叫UPSERT操作),核心思路是先把CSV数据导入临时表,再利用各数据库内置的UPSERT语法完成同步,比逐行处理脚本高效得多。下面分主流数据库给出具体方案:

MySQL/MariaDB

  1. 将CSV导入临时表
    先创建和目标表结构完全一致的临时表,再用LOAD DATA INFILE导入CSV:

    -- 创建临时表(假设目标表是target_table,结构为id INT PRIMARY KEY, col1 VARCHAR(50), col2 INT)
    CREATE TEMPORARY TABLE temp_target_table LIKE target_table;
    
    -- 导入CSV,根据实际格式调整参数
    LOAD DATA INFILE '/服务器上的CSV文件路径/data.csv'
    INTO TABLE temp_target_table
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' -- 如果CSV字段用引号包裹则加这句
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS; -- 若CSV第一行是表头则跳过
    
  2. 同步到目标表
    利用ON DUPLICATE KEY UPDATE语法完成UPSERT:

    INSERT INTO target_table (id, col1, col2)
    SELECT id, col1, col2 FROM temp_target_table
    ON DUPLICATE KEY UPDATE
    col1 = VALUES(col1),
    col2 = VALUES(col2);
    

    注:目标表必须已为主键(或唯一键)创建约束,否则ON DUPLICATE KEY不会生效。

PostgreSQL

  1. 将CSV导入临时表
    同样先创建结构匹配的临时表,再用COPY命令导入:

    CREATE TEMPORARY TABLE temp_target_table AS SELECT * FROM target_table LIMIT 0; -- 复制表结构但不复制数据
    
    -- 导入CSV,HEADER参数表示跳过表头行
    COPY temp_target_table (id, col1, col2)
    FROM '/服务器上的CSV文件路径/data.csv'
    DELIMITER ','
    CSV HEADER;
    
  2. 同步到目标表
    用ON CONFLICT ... DO UPDATE语法实现UPSERT:

    INSERT INTO target_table (id, col1, col2)
    SELECT id, col1, col2 FROM temp_target_table
    ON CONFLICT (id) DO UPDATE SET
    col1 = EXCLUDED.col1,
    col2 = EXCLUDED.col2;
    

    注:这里的id必须是目标表的主键或唯一约束列,EXCLUDED代表待插入的行数据。

SQL Server

  1. 将CSV导入临时表
    创建临时表后用BULK INSERT导入:

    CREATE TABLE #temp_target_table (
        id INT PRIMARY KEY,
        col1 VARCHAR(50),
        col2 INT
    ); -- 手动定义和目标表一致的结构
    
    BULK INSERT #temp_target_table
    FROM '/服务器上的CSV文件路径/data.csv'
    WITH (
        FIELDTERMINATOR = ',',
        ROWTERMINATOR = '\n',
        FIRSTROW = 2 -- 跳过表头行
    );
    
  2. 同步到目标表
    使用MERGE语句完成同步:

    MERGE INTO target_table AS tgt
    USING #temp_target_table AS src
    ON tgt.id = src.id
    WHEN MATCHED THEN
        UPDATE SET
            tgt.col1 = src.col1,
            tgt.col2 = src.col2
    WHEN NOT MATCHED THEN
        INSERT (id, col1, col2)
        VALUES (src.id, src.col1, src.col2);
    

通用注意事项

  • 确保CSV文件路径是数据库服务器本地路径,如果是客户端机器上的文件,可能需要先上传到服务器,或用客户端工具(如MySQL Workbench、pgAdmin)的导入功能配合上述SQL脚本。
  • 临时表的字段类型、长度必须和目标表完全匹配,避免导入或同步时出现数据类型错误。
  • 执行前建议备份目标表,避免因数据格式问题导致意外更新。

内容的提问来源于stack exchange,提问作者Phaelax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:17:24