如何用单SQL脚本实现CSV与现有数据库表的同步?
用单SQL脚本实现CSV与数据库表的同步(UPSERT操作)
当然可以用单SQL脚本实现这种「匹配主键则更新、未匹配则插入」的同步需求(行业内通常叫UPSERT操作),核心思路是先把CSV数据导入临时表,再利用各数据库内置的UPSERT语法完成同步,比逐行处理脚本高效得多。下面分主流数据库给出具体方案:
MySQL/MariaDB
将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第一行是表头则跳过同步到目标表
利用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
将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;同步到目标表
用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
将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 -- 跳过表头行 );同步到目标表
使用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
相关产品推荐
相关产品推荐

