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

Teradatasql Python模块批量插入未触发唯一键重复错误问题

Teradata批量插入唯一约束不报错?这么改就行

你遇到的问题是因为Teradata默认在批量操作时,会跳过违反唯一约束的行继续执行,不会主动抛出错误。要让代码触发重复键异常,按下面的方法修改:

两种解决办法

方法1:修改会话全局设置

在执行插入前,先设置会话的约束错误处理行为为“遇到错误就终止”,这样所有后续DML操作碰到约束问题都会直接报错:

with teradatasql.connect('{"host":"whomooz","user":"guest","password":"please", "autocommit": false}') as con:
    with con.cursor() as cur:
        # 先设置会话规则:约束错误直接终止操作
        cur.execute("SET SESSION CONSTRAINTS ERROR ACTION = 'ABORT';")
        cur.fast_executemany = True
        try:
            cur.execute("insert into voltab (?, ?)", [
                [1, "abc"],
                [2, "def"],
                [3, "ghi"]
            ])
            con.commit()
        except teradatasql.Error as e:
            con.rollback()
            print(f"插入失败:{e}")
            raise

方法2:仅针对当前插入语句生效

如果不想修改全局会话设置,可以在INSERT语句里加WITH ABORT ON CONSTRAINT ERROR子句,只让当前插入操作碰到约束错误时终止报错:

with teradatasql.connect('{"host":"whomooz","user":"guest","password":"please", "autocommit": false}') as con:
    with con.cursor() as cur:
        cur.fast_executemany = True
        try:
            # 插入语句里指定约束错误处理规则
            cur.execute("insert into voltab (?, ?) WITH ABORT ON CONSTRAINT ERROR", [
                [1, "abc"],
                [2, "def"],
                [3, "ghi"]
            ])
            con.commit()
        except teradatasql.Error as e:
            con.rollback()
            print(f"插入失败:{e}")
            raise

关键说明

  • 必须关闭autocommit,否则遇到错误时部分数据可能已经提交,无法回滚。
  • 两种方法都会在碰到第一个重复键时立即终止插入操作,并抛出teradatasql.Error异常,符合你要的报错需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:10:31