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

如何使用Python向SQL Server导入CSV数据时避免插入重复记录

问题解决方案

你遇到的重复插入问题是因为现有脚本每次执行都会把CSV里的全部数据无条件插入数据库,没有做旧数据去重校验,可根据你的使用场景选择以下两种修改方案:

方案1:清空表后全量插入(最简便,适合CSV每次存储全量最新数据的场景)

每次执行导入前先清空目标表,再插入CSV里的所有最新数据,修改后的完整代码如下:

import pandas as pd
import pyodbc

df = pd.read_csv ("C:/Users/Dhilip/Downloads/test.csv")
print(df)

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=DESKTOP-7FCK7FG;'
                      'Database=test;'
                      'Trusted_Connection=yes;')
cursor = conn.cursor()

# 新增:导入前清空目标表
cursor.execute('TRUNCATE TABLE test.dbo.people_info')
conn.commit()

for row in df.itertuples():
    cursor.execute('''
                INSERT INTO test.dbo.people_info (Name, Country, Age)
                VALUES (?,?,?)
                ''',
                row.Name, 
                row.Country,
                row.Age
                )
conn.commit()
# 关闭连接避免资源泄漏
cursor.close()
conn.close()

注意:该方案会先清空表中所有旧数据,请确认CSV文件包含所有需要留存的全量数据再使用。

方案2:增量插入(仅插入CSV中数据库不存在的新数据,适合需要增量更新的场景)

修改插入逻辑,仅当对应记录不在数据库中时才执行插入,修改后的核心插入逻辑如下:

for row in df.itertuples():
    cursor.execute('''
                INSERT INTO test.dbo.people_info (Name, Country, Age)
                SELECT ?, ?, ?
                WHERE NOT EXISTS (
                    SELECT 1 FROM test.dbo.people_info 
                    WHERE Name = ? AND Country = ? AND Age = ?
                )
                ''',
                row.Name, row.Country, row.Age,
                row.Name, row.Country, row.Age
                )
conn.commit()

可选优化:如果Name字段是唯一标识,可以给people_info表的Name字段添加唯一索引,重复插入时会直接触发约束报错,进一步避免脏数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:06:03