mysql - 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 的插入准备失败
解决方案
我对 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 数组将只是一个项目)。
推荐阅读
- java - 方法重载技术
- java - 如何解决这个反射错误?java.lang.reflect.Field.get(Field.java:393)
- python - Python代码中的`r"""`是什么意思?
- pyspark - 在python中使用datarframe转换df但没有单独的列值
- java - 如何在实体中为 java Map 接口创建 json 类型
- django - 没有模型 APIView 的 DRF 分页自定义响应
- python - 为什么我获得不同的 f1 分数?
- kubernetes - aws-load-balancer-controller 错误:无法从 *v1.Ingress 获取日志:*v1.Ingress 的选择器未实现
- python-3.x - 循环遍历 python 列表
- python - 重复 NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported 尝试了以前的解决方案无济于事