sql—如果cursor.executemany在python中失败会发生什么

brc7rcf0  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(312)

我正在使用 cursor.executemany 从其他源向snowflake数据库中插入数千行。因此,如果insert由于某种原因失败,它是否回滚所有insert?
是否只有在同一行还不存在的情况下才可以插入?表中没有主键或唯一键

velaa5lx

velaa5lx1#

因此,如果insert由于某种原因失败,它是否回滚所有insert?
这个 cursor.executemany(…) snowflake的python连接器中的实现填充了一个多行insert-into命令,该命令的值在insert运行之前由查询编译器进行预计算,因此如果某个值对其定义的列类型不可接受,则它们都会一起运行或提前失败。
是否只有在同一行还不存在的情况下才可以插入?表中没有主键或唯一键
如果没有类似id的列,则需要定义一个条件来限定两行是相同的(例如多列匹配)。
假设新的插入批在临时表中 TEMP ,可以将以下sql插入 DESTINATION 表中的集合来检查所有行 DESTINATION table。
使用 HASH(…) 作为比较的基础,将每行中的所有列(按顺序)进行比较:

INSERT INTO DESTINATION
  SELECT *
  FROM TEMP
  WHERE
    HASH(*) IS NOT IN ( SELECT HASH(*) FROM DESTINATION )

正如christian在评论中所建议的 MERGE 一旦有了标识符策略(连接键),也可以使用sql命令。这也要求新行首先放置在临时表中,并提供执行 UPDATE 如果已经找到一行。
注: HASH(…) 可能有碰撞,不是最合适的。更好的方法是使用表的一个或多个列形成一个标识符,并将它们进行比较。您的问题缺少关于表和数据特征的信息,因此我选择了一种非常简单的方法,包括 HASH(…) 在这里。

相关问题