我和一个朋友有点问题 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
.
暂无答案!
目前还没有任何答案,快来回答吧!