使用预准备语句后,SELECT LAST_INSERT_ID()返回0

Tho*_*ews 3 c++ mysql mysqldump prepared-statement

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

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

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

我在用:

  • 服务器版本:5.1.46社区MySQL社区服务器(GPL)
  • Visual Studio 2008,版本9.
  • MySQL Connector 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)
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

准备好的声明:

INSERT INTO Picture_Image_Data
(ID_Image_Data, Image_Data)
VALUES
    (?,
       ?);
Run Code Online (Sandbox Code Playgroud)

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


编辑:

我将ID字段设置为零,将下一个字段设置为C++ std::istream *.根据MySQL手册页面LAST_INSERT_ID():

LAST_INSERT_ID()如果将行的AUTO_INCREMENT列设置为非"魔术"值(即,非NULL且不为0的值),则不会更改.

由于预准备语句中的ID值为0,因此LAST_INSERT_ID()应返回1.


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

{搜索网络显示使用自定义MySQL API,但使用PHP和更进一步的评论说它需要另一个连接).

Ser*_*gey 5

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)
Run Code Online (Sandbox Code Playgroud)

这是隐含的:

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)
Run Code Online (Sandbox Code Playgroud)