我有一个包含大量数据的列表(将接近1000)。我想一次添加到一行中。这是不是直接像一个for循环那样在列表上进行多次插入?多次提交?这是不是不好的做法?谢谢我还没有尝试,因为只是设置表列,这是许多需要知道,如果可行的,谢谢
gz5pxeao1#
如果使用SQL插入:
INSERT INTO 'tablename' ('column1', 'column2') VALUES ('data1', 'data2'), ('data1', 'data2'), ('data1', 'data2'), ('data1', 'data2');
如果您使用代码...使用for循环生成上面的查询,然后运行它。要获得更有效的方法,请考虑如下所示的并集:Is it possible to insert multiple rows at a time in an SQLite database?
insert into 'tablename' ('column1','column2') select data1 as 'column1',data2 as 'column2' union select data3,data4 union...
utugiqy62#
在sqlite中,你没有网络延迟,所以向引擎发出很多小请求并不影响性能。要了解更多关于这方面的参考,你可以阅读官方文档:https://www.sqlite.org/np1queryprob.html但是在写模式下(插入或更新),每个单独的查询都必须支付隐式事务的成本。为了避免这种情况,你需要将插入查询集中到一个显式事务中。根据你的编程语言,你可以改变你的做法。下面是一个代码样本,说明如何在go中做到这一点。我简化了错误代码管理,以便更好地了解要点。
tx, _ := db.Begin() for _, item := range items { tx.Exec(`INSERT INTO testtable (col1, col2) VALUES (?, ?)`, item.Field1, item.Field2) } tx.Commit()
如果在循环中检测到错误,则需要调用tx.Commit()来取消之前对数据库的所有写入,以便最终状态就像根本没有发出插入查询一样。
tx.Commit()
2条答案
按热度按时间gz5pxeao1#
如果使用SQL插入:
如果您使用代码...使用for循环生成上面的查询,然后运行它。
要获得更有效的方法,请考虑如下所示的并集:Is it possible to insert multiple rows at a time in an SQLite database?
utugiqy62#
在sqlite中,你没有网络延迟,所以向引擎发出很多小请求并不影响性能。要了解更多关于这方面的参考,你可以阅读官方文档:https://www.sqlite.org/np1queryprob.html
但是在写模式下(插入或更新),每个单独的查询都必须支付隐式事务的成本。为了避免这种情况,你需要将插入查询集中到一个显式事务中。根据你的编程语言,你可以改变你的做法。下面是一个代码样本,说明如何在go中做到这一点。我简化了错误代码管理,以便更好地了解要点。
如果在循环中检测到错误,则需要调用
tx.Commit()
来取消之前对数据库的所有写入,以便最终状态就像根本没有发出插入查询一样。