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

如何实现数据库新增记录时的重复检测与跳过逻辑?

解决数据库插入前的重复记录检查问题

核心问题修正

你之前的代码无法生效,主要是3个问题:

  1. Python的数据库游标没有exists()函数,不能直接这么用
  2. 查询语句直接写变量会触发SQL注入,且MySQL会把变量识别为字段名
  3. INSERT语句的列数和传入的值数量不匹配(你写了8个列,但传了9个值)

修正后的完整代码

# 简化空链接判断,直接用布尔值
control = link != ""

if control:
    # 1. 检查当前link是否已存在于ad_l表的link列
    check_query = "SELECT 1 FROM ad_l WHERE link = %s"
    # 用参数化查询避免SQL注入,注意单元素元组要加逗号
    cursor.execute(check_query, (link,))
    # 能查到结果则说明记录已存在
    record_exists = cursor.fetchone() is not None

    if record_exists:
        print('该链接已存在,跳过添加')
    else:
        # 2. 插入新记录,修正列数和值的匹配问题(添加link列)
        insert_query = """
            INSERT INTO ad_l(id, count, clist_id, brand_model, ad, link, created_at, updated_at, status)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
        """
        val = (id, count, clist_id, brand_model, ad_link, link, created_at, updated_at, status)
        cursor.execute(insert_query, val)
        scrap_db.commit()
        print(cursor.rowcount, "记录成功插入到*ad_l*表")

可选:用链接中的id进行检查

如果想通过链接里的id(而非完整链接)判断重复,先从link中提取id,再修改检查语句:

# 示例:从link提取id,假设link格式为"https://xxx.com/ad/12345"
extracted_id = link.split("/")[-1]

# 修改检查语句为针对id列
check_query = "SELECT 1 FROM ad_l WHERE id = %s"
cursor.execute(check_query, (extracted_id,))
record_exists = cursor.fetchone() is not None

额外提示

  • 建议给ad_l表的link列(或id列)添加唯一索引,从数据库层面避免重复,防止并发插入时出现重复记录
  • 批量处理时,可以用executemany配合INSERT ... ON DUPLICATE KEY UPDATE语法,效率更高

内容的提问来源于stack exchange,提问作者B.12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:40:34