我正在使用 cursor.executemany 从其他源向snowflake数据库中插入数千行。因此,如果insert由于某种原因失败,它是否回滚所有insert?是否只有在同一行还不存在的情况下才可以插入?表中没有主键或唯一键
cursor.executemany
velaa5lx1#
因此,如果insert由于某种原因失败,它是否回滚所有insert?这个 cursor.executemany(…) snowflake的python连接器中的实现填充了一个多行insert-into命令,该命令的值在insert运行之前由查询编译器进行预计算,因此如果某个值对其定义的列类型不可接受,则它们都会一起运行或提前失败。是否只有在同一行还不存在的情况下才可以插入?表中没有主键或唯一键如果没有类似id的列,则需要定义一个条件来限定两行是相同的(例如多列匹配)。假设新的插入批在临时表中 TEMP ,可以将以下sql插入 DESTINATION 表中的集合来检查所有行 DESTINATION table。使用 HASH(…) 作为比较的基础,将每行中的所有列(按顺序)进行比较:
cursor.executemany(…)
TEMP
DESTINATION
HASH(…)
INSERT INTO DESTINATION SELECT * FROM TEMP WHERE HASH(*) IS NOT IN ( SELECT HASH(*) FROM DESTINATION )
正如christian在评论中所建议的 MERGE 一旦有了标识符策略(连接键),也可以使用sql命令。这也要求新行首先放置在临时表中,并提供执行 UPDATE 如果已经找到一行。注: HASH(…) 可能有碰撞,不是最合适的。更好的方法是使用表的一个或多个列形成一个标识符,并将它们进行比较。您的问题缺少关于表和数据特征的信息,因此我选择了一种非常简单的方法,包括 HASH(…) 在这里。
MERGE
UPDATE
1条答案
按热度按时间velaa5lx1#
因此,如果insert由于某种原因失败,它是否回滚所有insert?
这个
cursor.executemany(…)
snowflake的python连接器中的实现填充了一个多行insert-into命令,该命令的值在insert运行之前由查询编译器进行预计算,因此如果某个值对其定义的列类型不可接受,则它们都会一起运行或提前失败。是否只有在同一行还不存在的情况下才可以插入?表中没有主键或唯一键
如果没有类似id的列,则需要定义一个条件来限定两行是相同的(例如多列匹配)。
假设新的插入批在临时表中
TEMP
,可以将以下sql插入DESTINATION
表中的集合来检查所有行DESTINATION
table。使用
HASH(…)
作为比较的基础,将每行中的所有列(按顺序)进行比较:正如christian在评论中所建议的
MERGE
一旦有了标识符策略(连接键),也可以使用sql命令。这也要求新行首先放置在临时表中,并提供执行UPDATE
如果已经找到一行。注:
HASH(…)
可能有碰撞,不是最合适的。更好的方法是使用表的一个或多个列形成一个标识符,并将它们进行比较。您的问题缺少关于表和数据特征的信息,因此我选择了一种非常简单的方法,包括HASH(…)
在这里。