Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SELECT LAST_INSERT_ID()在使用PREADED语句后返回0_C++_Mysql_Prepared Statement_Mysqldump - Fatal编程技术网

C++ SELECT LAST_INSERT_ID()在使用PREADED语句后返回0

C++ SELECT LAST_INSERT_ID()在使用PREADED语句后返回0,c++,mysql,prepared-statement,mysqldump,C++,Mysql,Prepared Statement,Mysqldump,我正在使用MySQL和一条准备好的语句插入一条BLOB记录(jpeg图像)。执行准备好的语句后,我发出一个SELECT LAST\u INSERT\u ID(),它返回0 在我的代码中,我在执行命令后放置了一个断点,在MySQL命令(监视器)窗口中,我发出SELECT LAST\u INSERT\u ID(),它返回零 在MySQL命令(monitor)窗口中,我发出一条SQL语句来选择所有ID,最后(唯一)插入的ID是1(一) 我正在使用: 服务器版本:5.1.46-community My

我正在使用MySQL和一条准备好的语句插入一条
BLOB
记录(jpeg图像)。执行准备好的语句后,我发出一个
SELECT LAST\u INSERT\u ID()
,它返回0

在我的代码中,我在执行命令后放置了一个断点,在MySQL命令(监视器)窗口中,我发出
SELECT LAST\u INSERT\u ID()
,它返回零

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

我正在使用:

  • 服务器版本:5.1.46-community MySQL社区服务器(GPL)
  • VisualStudio2008,第9版
  • MySQL连接器C++ +0.0.5/LI>
我的表格说明:

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_数据字段为1,但最后一个_INSERT_ID为零。表是在执行此语句之前创建的,因此这是表中唯一的记录


编辑: 我将ID字段设置为0,下一字段设置为C++ >代码> STD::IistRAM**/COD>。根据报告:

如果将行的“自动增量”列设置为非“魔法”值(即,一个非空且非0的值),则不会更改
LAST\u INSERT\u ID()
的值

最后一个_INSERT_ID()应该返回1,因为prepared语句中的ID值为0


我是否需要为获取最后一个\u INSERT\u ID做一个准备好的语句


{搜索web显示使用自定义MySQL API,但使用PHP的用户表示需要另一个连接。

LAST_INSERT_ID仅适用于自动生成的主键,该主键是在auto_increment字段上创建的。在您的情况下,看起来您是显式提供ID,因此LAST INSERT 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)

看起来是与MySQL C++连接器有关的问题。

  • LAST\u INSERT\u ID()
    在 ID字段为空,显式 插入
  • LAST\u INSERT\u ID()
    在 未指定ID字段, 隐式插入
  • 我试着从命令行(监视器)插入
    BLOB
    (JPEG图像),它可以工作:

    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.03 sec)
    mysql> PREPARE blob_stmt
        ->     FROM 'INSERT INTO picture_image_data (ID_Image_Data, Image_Data) VALUES (?, LOAD_FILE(?))';
    Query OK, 0 rows affected (0.02 sec)
    Statement prepared
    
    mysql> SET @id = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SET @c = 'KY_hot_brown_picture.jpg';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> EXECUTE blob_stmt USING @id, @c;
    Query OK, 1 row affected (0.15 sec)
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                2 |
    +------------------+
    
    1 row in set (0.00 sec)
    

    目前,解决方案是使用SQL语句插入具有准备语句的BLB,而不是MySQL C++连接器API。

    < P>不能期望在MySQL命令行客户端上发布<代码>选择LSTIXINTERTTION()/CULL,以给出C++代码中生成的最后插入值。 < LastIsIdTytId()给你在给定连接上的最后一个自动生成的ID。显然,C++程序和MySQL客户端使用2种不同的连接到MySQL服务器。


    (最后一个插入ID()也应该在插入之后使用,插入之间不要有其他SQL语句,请选择最后一个插入ID())

    最后一个插入ID是特定于连接的,您在哪里执行准备好的插入?我提供的ID字段为零。根据手册页面,最后一个插入ID()的值如果将行的AUTO_INCREMENT列设置为非“魔术”值(即非空且非0的值),则不会更改所以它应该工作。嗯,你说得对…我刚才试过了,它在MySQL控制台中工作。我对C++连接器不太熟悉。但是,既然你在控制一个语句,你可以通过删除插入到那个列的方法来修复它。在代码中,从LastIdItTuxId()返回值。为零。我将更改代码,使其仅使用select语句,而不使用prepared语句API。当我在没有prepared语句的情况下使用程序将记录插入表中时,我可以通过命令行检查
    LAST\u insert\u ID
    ,结果是正确的。@Thomas Matthews您不能相信会出现这种情况。它仍然非常有用n不知道您的问题是在代码中执行此操作,还是实际问题是在另一个连接上的终端中运行SELECT LAST_INSERT_ID(),这无论如何都不应该起作用