c++ - 使用准备语句后 SELECT LAST_INSERT_ID() 返回 0

标签 c++ mysql prepared-statement mysqldump

我正在使用 MySQL 和准备好的语句插入 BLOB 记录(jpeg 图像)。执行准备好的语句后,我发出 SELECT LAST_INSERT_ID() 并返回 0。

在我的代码中,我在执行命令后放置了一个断点,在 MySQL 命令(监视器)窗口中,我发出 SELECT LAST_INSERT_ID() 并返回零。

在 MySQL 命令(监视器)窗口中,我发出一条 SQL 语句来选择所有 ID,最后(唯一)插入的 ID 是 1(一个)。

我正在使用:

  • 服务器版本:5.1.46-community MySQL 社区服务器 (GPL)
  • Visual Studio 2008,版本 9。
  • MySQL 连接器 C++ 1.0.5

我的表描述:

mysql> describe picture_image_data;
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| ID_Image_Data | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| Image_Data    | mediumblob       | YES  |     | NULL    |                |
+---------------+------------------+------+-----+---------+----------------+
2 rows in set (0.19 sec)

使用 MySQL 监视器的结果:

mysql> select ID_Image_Data
    -> from picture_image_data;
+---------------+
| ID_Image_Data |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

准备好的语句:

INSERT INTO Picture_Image_Data
(ID_Image_Data, Image_Data)
VALUES
    (?,
       ?);

上面的结果显示 ID_Image_Data 字段为 1,但 LAST_INSERT_ID 为零。表是在执行这条语句之前创建的,所以这是表中唯一的记录。


编辑:

我将 ID 字段设置为零,将下一个字段设置为 C++ std::istream *。根据MySQL Manual Page for LAST_INSERT_ID() :

如果您将行的 AUTO_INCREMENT 列设置为非“魔术”值(即,一个值是不是 NULL 也不是 0)。

LAST_INSERT_ID() 应该返回 1,因为准备好的语句中的 ID 值为 0。


我需要为获取 LAST_INSERT_ID 做一个准备好的语句吗?

{网上搜索显示使用自定义 MySQL API,但使用的是 PHP 并且进一步的评论说它需要另一个连接)。

最佳答案

LAST_INSERT_ID 仅适用于在 auto_increment 字段上创建的自动生成的主键。在您的情况下,您似乎明确提供了 id,因此未设置最后插入的 id。

这是明确的:

mysql> insert into test (id, name) VALUES (5, 'test 2');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

这是隐含的:

mysql> insert into test (name) values ('test');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

关于c++ - 使用准备语句后 SELECT LAST_INSERT_ID() 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124546/

相关文章:

PHP PDO MySQL IN (?,?,?

c++ - 为什么我可以通过原始指针而不是 shared_ptr 修改对象?

c++ - 我们应该使用 poll() 还是 select()?

php - php和mysql给用户按小时加分的解决方法?

mysql - 使用删除按钮从数据库中永久删除行(laravel)

mysql - 采埃孚 "Object of class Zend_Db_Table_Rowset could not be converted to string"

java - 如何在 Java 中将日期插入 MySQL 数据库表?

php - 准备好的语句与存储过程

c++ - 查找数组中缺失的数字

c++ - 如何将模板构造函数特化移动到 cpp 文件?