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

C#操作MySQL插入代理数据时如何去除重复行问题求解

实现重复数据过滤的修改方案

第一步:优先在数据库层加兜底约束(最可靠)

给proxiestb表的ip、port字段添加联合唯一索引,从根本上禁止重复的ip+port组合写入,执行SQL如下:

ALTER TABLE proxiestb ADD UNIQUE INDEX idx_ip_port (ip, port);

添加索引后,只需要修改你的插入SQL语句为INSERT IGNORE语法即可,重复数据会被自动跳过不会抛出异常,修改后的代码如下:

for (int i = 0; i < ips.Count; i++)
{
    MySqlCommand command = con.CreateCommand();
    // 新增IGNORE关键字,重复数据直接跳过插入
    command.CommandText = "INSERT IGNORE INTO proxiestb (ip,port) VALUES (@ip,@port)";
    command.Parameters.AddWithValue("@ip", ips[i].InnerText);
    command.Parameters.AddWithValue("@port", ports[i].InnerText);
    Console.WriteLine(ips[i].InnerText + ":" + ports[i].InnerText);
    command.ExecuteNonQuery();
}

如果重复数据出现时你需要更新其他字段(比如最后更新时间、存活状态等),可以把SQL替换为ON DUPLICATE KEY UPDATE语法,示例:

INSERT INTO proxiestb (ip,port,last_check_time) VALUES (@ip,@port,NOW()) 
ON DUPLICATE KEY UPDATE last_check_time = NOW()

第二步:代码层前置去重(可选,提升性能)

如果爬取的数据量较大,为了减少无效的数据库请求,可以在插入前先对爬取到的结果做两次去重:

  • 单次爬取结果内部去重:把本次爬取到的ip、port配对后存入HashSet,自动过滤同一次爬取任务中重复的代理
  • 跨批次去重:插入前先查询数据库中已存在的ip+port组合,过滤掉已经入库的代理后再执行批量插入

额外优化建议

循环单条插入性能较低,数据量较大时可以改用批量插入语法或者MySqlBulkCopy类,减少和数据库的交互次数,提升执行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:06:09