首页 > 解决方案 > C中的一个sql语句中的多个插入

问题描述

我想一口气将 6406 个记录插入到表中,而无需准备和执行单个记录。(最快的)。在下面的代码中,我希望每次插入都更改“i”

我已经尝试了一切

for( int i = 0; i < 6406 ; i++)
 {
  sprintf( query, "INSERT INTO table1"
                "(table_id, curr_id, cur_ref_id) "
                "VALUES (%d,%d,%d)",
                table_id,
                i,
                table_id);

  //assemble query
   DBH->prepare(query);
 }
DBH->execute();

表 1 的插入准备失败

标签: mysqlc

解决方案


我对 MySQL C API 的记忆有点模糊,但 IIRC 应该看起来像:

MYSQL_STMT* stmt = mysql_stmt_init(MYSQL *mysql);
mysql_stmt_prepare(stmt,
  "INSERT INTO table1 (table_id, curr_id, cur_ref_id) VALUES (?,?,?)",
  len_of_previous_argument);

MYSQL_BIND params[3];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[1].buffer_type = MYSQL_TYPE_LONG;
params[2].buffer_type = MYSQL_TYPE_LONG;

params[0].buffer = &table_id;
params[2].buffer = &table_id;

mysql_bind_param(stmt, params);

mysql_autocommit(conn, 0);
for ( int i = 0; i < 6406 ; i++) {
  params[1].buffer = &i;
  mysql_stmt_execute(stmt);
}
mysql_commit(conn);

mysql_stmt_close(stmt);

您显然想要进行一些错误处理,但这应该给您基本的想法。

只有一个参数并编码table_id查询字符串中的值可能会更快,但我很懒,你显然已经知道如何做到这一点(snprintf应该有“(%d,?,%d)”,然后通过结果到mysql_stmt_prepare,那么 params 数组将只是一个项目)。


推荐阅读