Несколько вставок в одном выражении SQL в C - PullRequest
1 голос
/ 21 июня 2019

Я хочу одним махом вставить 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

1 Ответ

0 голосов
/ 21 июня 2019

Моя память о 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 будет только одним элементом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...