当前位置: 首页 > 面试题库 >

如何一次插入多个数据

申浩广
2023-03-14
问题内容

我知道一次插入多个数据效率更高:

INSERT INTO test(n1, n2, n3) 
VALUES(v1, v2, v3),(v4, v5, v6),(v7, v8, v9);

在golang中该怎么做?

data := []map[string]string{
   {"v1":"1", "v2":"1", "v3":"1"},
   {"v1":"2", "v2":"2", "v3":"2"},
   {"v1":"3", "v2":"3", "v3":"3"},
}
//I do not want to do it
for _, v := range data {
    sqlStr := "INSERT INTO test(n1, n2, n3) VALUES(?, ?, ?)"
    stmt, _ := db.Prepare(sqlStr)
    res, _ := stmt.Exec(v["v1"], v["v2"], v["v3"])
}

使用字符串拼接,但这不是很好。db.Prepare更安全吧?

sqlStr := "INSERT INTO test(n1, n2, n3) VALUES"
for k, v := range data {
    if k == 0 {
        sqlStr += fmt.Sprintf("(%v, %v, %v)", v["v1"], v["v2"], v["v3"])
    } else {
        sqlStr += fmt.Sprintf(",(%v, %v, %v)", v["v1"], v["v2"], v["v3"])
    } 
}
res, _ := db.Exec(sqlStr)

我需要一个功能更安全,更高效的函数,一次插入多个数据。


问题答案:

为什么不这样呢?(在此处编写但未进行测试,因此可能存在语法错误):

sqlStr := "INSERT INTO test(n1, n2, n3) VALUES "
vals := []interface{}{}

for _, row := range data {
    sqlStr += "(?, ?, ?),"
    vals = append(vals, row["v1"], row["v2"], row["v3"])
}
//trim the last ,
sqlStr = sqlStr[0:len(sqlStr)-1]
//prepare the statement
stmt, _ := db.Prepare(sqlStr)

//format all vals at once
res, _ := stmt.Exec(vals...)


 类似资料:
  • 我是sybase db的新手。我正在尝试使用以下代码插入多行 并且我在第一条语句的末尾收到错误“';'附近的语法不正确”?有什么想法吗?

  • 问题内容: 我在应用程序中使用MongoDB,需要在MongoDB集合中插入多个文档。我使用的版本是1.6 我在这里看到一个例子 http://docs.mongodb.org/manual/core/create/ 在里面 批量插入多个文档 部分 作者传递数组的位置。 当我尝试同样的操作时,但是为什么不允许这样做,请告诉我如何一次插入多个文档? 请让我知道这是什么方法,以便可以通过java一次插

  • 我将一行一行地插入数据,但我在某处听说,如果有许多数据要插入,则需要很多时间。那么,如何一次将它们全部插入?

  • 问题内容: 我创建了一个数据库名称movielibrarysystem,其中有3个表。 分别是类型,发布者和电影..​​.现在1个发布者可以有很多电影,而1个电影则有很多类型..在movie表中,发布者ID和typeid都充当外键。 我的问题是,如何在电影表中插入数据…我已经将数据插入到发行商和类型表中,但是我无法插入电影表中。 问题答案: 这就是你要做的。首先,发行人与电影之间的关系是一对多的-

  • 问题内容: 我有一个清单清单,例如。 我有一个叫做的表格和两个字段,。字段列表中的第一项映射到,第二项映射到。 如何在单个命令或调用中为每个内部列表插入行,而不是像这样使用for循环? 问题答案: 从《MySQLdb用户指南》中: 所以在你的情况下: