插入到选择报表不起作用

sxissh06  于 2021-06-20  发布在  Mysql
关注(0)|答案(0)|浏览(199)

我和一个朋友有点问题 INSERT INTO ... SELECT ... 我不太明白的陈述。我不确定这是mariadb的问题还是我做错了什么。
我有一张table(我们称之为 table_a ),它由列组成 id , c ,和 b . c 以及 b 不是唯一的,但我在上设置了索引 c .
我还有一张table(我们会叫它 table_b ),它由列组成 table_a_id_1 , table_a_id_1 . 我用这个表来跟踪 table_a 具有相同的 c 如果行1-4都具有相同的 c ,则在 table_b -- 1, 2 , 1, 3 , 1, 4 , 2, 3 , 2, 4 ,和 3, 4 .
所以,我的想法是——我在 table_a . 在每一次之后,我抓取insert id,将其存储在 insert_id ,然后用以下查询准备语句: INSERT INTO table_b (table_a_id_1, table_a_id_2) SELECT ?, id FROM table_a WHERE c = ? AND id != ? 然后我绑定 insert_id ,的值 c 我刚插进去的 table_a ,和 insert_id (再次)执行语句。
我的问题是 INSERT INTO ... SELECT ... 查询不起任何作用。它不会导致任何错误--只是不会插入任何内容。但是,如果我抓住 insert_id 以及 c 并通过phpmyadmin运行查询,它工作正常。我没有在这个程序中使用事务…所以我真的很困惑,为什么手动操作和编程操作是有效的。
有人知道它为什么这么做吗?
编辑:我改变了我的程序,这样我就可以分开了 SELECT 以及 INSERT 查询。在我的程序中 SELECT 查询没有显示任何行,即使我在phpmyadmin之类的程序中运行完全相同的查询时可以看到它们。我真的很困惑。
编辑2:以下是我的代码(为了简洁起见,删除了一些错误处理代码):

int save_to_database(char *b, char *c, my_ulonglong &insert_id) {
  const char *insert_str = "INSERT INTO table_a (c, b) VALUES (?, ?)";
  MYSQL_STMT *stmt;
  MYSQL_BIND bind[2];
  int retval;
  unsigned long buffer_length[2];
  my_bool is_null[2];

  stmt = mysql_stmt_init(boinc_db.mysql);
  if(!stmt) {
    // Print an error, return -1
  }

  retval = mysql_stmt_prepare(stmt, insert_str, strlen(insert_str));
  if(retval) {
    // Print an error, close stmt, return -1
  }

  memset(bind, 0, sizeof(bind));

  buffer_length[0] = strlen(c);
  buffer_length[1] = strlen(b);

  is_null[0] = 0;
  is_null[1] = 0;

  bind[0].buffer_type = MYSQL_TYPE_STRING;
  bind[0].buffer = c;
  bind[0].buffer_length = buffer_length[0];
  bind[0].length = &buffer_length[0];
  bind[0].is_null = &is_null[0];
  bind[0].is_unsigned = 0;

  bind[1].buffer_type = MYSQL_TYPE_STRING;
  bind[1].buffer = b;
  bind[1].buffer_length = buffer_length[1];
  bind[1].length = &buffer_length[1];
  bind[1].is_null = &is_null[1];
  bind[1].is_unsigned = 0;

  if(mysql_stmt_bind_param(stmt, bind)) {
    // Print an error, close stmt, return -1
  }

  if(mysql_stmt_execute(stmt)) {
    // Print an error, close stmt, return -1
  }

  insert_id = mysql_stmt_insert_id(stmt);

  mysql_stmt_close(stmt);
  return 0;
}

int generate_matches(my_ulonglong pair_id, char *c) {
  const char *insert_str = "INSERT INTO table_b (a_pair, b_pair) SELECT ?, id FROM table_a WHERE c = ? AND id != ?";

  MYSQL_STMT *stmt;
  MYSQL_BIND in_bind[3];
  int retval;
  unsigned long in_buffer_len[3];
  my_bool in_is_null[3];

  stmt = mysql_stmt_init(boinc_db.mysql);
  if(!stmt) {
    // Print an error, return -1
  }

  retval = mysql_stmt_prepare(stmt, insert_str, strlen(insert_str));
  if(retval) {
    // Print an error, close stmt, return -1
  }

  memset(in_bind, 0, sizeof(in_bind));

  in_buffer_len[0] = sizeof(pair_id);
  in_is_null[0] = 0;

  in_buffer_len[1] = strlen(c) + 1;
  in_is_null[1] = 0;

  in_buffer_len[2] = sizeof(pair_id);
  in_is_null[2] = 0;

  in_bind[0].buffer_type = MYSQL_TYPE_LONGLONG;
  in_bind[0].buffer = (void *) &pair_id;
  in_bind[0].buffer_length = in_buffer_len[0];
  in_bind[0].length = &in_buffer_len[0];
  in_bind[0].is_null = &in_is_null[0];
  in_bind[0].is_unsigned = 1;

  in_bind[1].buffer_type = MYSQL_TYPE_STRING;
  in_bind[1].buffer = (void *) c;
  in_bind[1].buffer_length = in_buffer_len[1];
  in_bind[1].length = &in_buffer_len[1];
  in_bind[1].is_null = &in_is_null[1];
  in_bind[1].is_unsigned = 0;

  in_bind[2].buffer_type = MYSQL_TYPE_LONGLONG;
  in_bind[2].buffer = (void *) &pair_id;
  in_bind[2].buffer_length = in_buffer_len[2];
  in_bind[2].length = &in_buffer_len[2];
  in_bind[2].is_null = &in_is_null[2];
  in_bind[2].is_unsigned = 1;

  if(mysql_stmt_bind_param(stmt, in_bind)) {
    // Print an error, close stmt, return -1
  }

  if(mysql_stmt_execute(stmt)) {
    // Print an error, close stmt, return -1
  }

  mysql_stmt_close(stmt);

  return 0;
}

在接下来的课程中,我有:

if(save_to_database(b, c, insert_id)) {
    // Throw an error and exit
  }

  if(generate_matches(insert_id, c)) {
    // Throw an error and exit
  }

在我的数据库中,我可以看到这样的例子:

MariaDB [database]> SELECT * FROM table_a WHERE c = "1000140625" AND id != 27803;
+-------+------------+-----------+
| id    | c          | b         |
+-------+------------+-----------+
| 27801 | 1000140625 | 537675600 |
| 27802 | 1000140625 | 659036664 |
+-------+------------+-----------+
2 rows in set (0.00 sec)

我的日志文件显示没有抛出任何错误,但是中没有记录 table_b .

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题