代码之家  ›  专栏  ›  技术社区  ›  Poni

mysql_insert_id()问题与mysql 5.0.67+windows+vc++2008

  •  0
  • Poni  · 技术社区  · 16 年前

    在手册页上; http://dev.mysql.com/doc/refman/5.0/en/mysql-insert-id.html 据说“返回前一个insert或update语句为自动递增列生成的值”。

    问题是更新后它对我来说不太管用。

    真正需要的是,我正在尝试更新表中的一行(用“where”条件更新),然后,如果确实更新了一行,请获取它的完整详细信息。 所以,首先我更新,然后我需要它的ID来获取带有select语句的详细信息。

    下面是一个显示问题的示例代码:

    #define _WIN32_WINNT 0x0400
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    #include <stdio.h>
    #include <conio.h>
    
    #include <winsock.h>
    
    #include "C:/Program Files (x86)/MySQL/MySQL Server 5.0/include/mysql.h"
    #pragma comment(lib, "C:/Program Files (x86)/MySQL/MySQL Server 5.0/lib/opt/libmysql.lib")
    
    void main()
    {
     MYSQL *conn = mysql_init(NULL);
     if(conn == NULL)
      throw "error";
     if(mysql_real_connect(
      conn,
      "127.0.0.1",
      "user", "passwd",
      NULL,
      0,
      NULL,
      0) != conn)
      throw "error";
    
     int nRet = 0;
    
     char szInsert[] = "INSERT INTO db_transation_test.tbl_transactions SET amount=71, ses=72";
     nRet = mysql_real_query(conn, szInsert, sizeof(szInsert));
     if(nRet != 0)
     {
      printf("%s\n", mysql_error(conn));
      throw;
     }
     my_ulonglong inserted_id = mysql_insert_id(conn);
    
     ///////// the real issue of my post starts here /////////
    
     char szUpdateTemplate[] = "UPDATE db_transation_test.tbl_transactions SET amount=123 WHERE id_transaction=%lld";
     char szUpdate[1024];
     nRet = sprintf_s(szUpdate, sizeof(szUpdate), szUpdateTemplate, inserted_id);
     nRet = mysql_real_query(conn, szUpdate, nRet);
     if(nRet != 0)
     {
      printf("%s\n", mysql_error(conn));
      throw;
     }
     my_ulonglong updated_id = mysql_insert_id(conn); // returns ZERO instead of 'inserted_id' :(
    
     _getch();
    }
    

    在这种情况下,我如何使这个mysql_insert_id()函数正常工作,或者如何在一个statament中更新和选择?

    请注意,我在这个示例中插入了一行,这样它将为您生成一些行,这样您就可以看到..

    谢谢您!

    编辑: 查看我对这个问题的最新答复。我描述得更清楚了。

    5 回复  |  直到 12 年前
        1
  •  0
  •   nos    16 年前

    更新语句不会导致生成自动增加的ID,因此在更新后调用mysql_insert_id是没有意义的。

    正如文档所说,mysql插入id()用于生成自动递增值的insert语句,或直接调用'last插入id(expr)^的update/insert语句。

    你已经拿到了 inserted_id 在insert语句之后,不需要再次获取它。

    编辑,你显然在问别的事情。

    你有点像 UPDATE db_transation_test.tbl_transactions SET amount=123 WHERE username=someone;

    您想获取查询更新的任何行的主键吗?这是你真正的问题吗?

    如果是这样的话。否。运行单独的select查询以获取该ID。

        2
  •  0
  •   nos    16 年前

    更新语句不会导致生成自动增加的ID,因此在更新后调用mysql_insert_id是没有意义的。

    正如文档所说,mysql插入id()用于生成自动递增值的insert语句,或直接调用'last插入id(expr)^的update/insert语句。

    你已经拿到了 inserted_id 在insert语句之后,不需要再次获取它。

        3
  •  0
  •   Mike Sherov    16 年前

    如果update语句修改了自动递增的值,mysql_insert_id将只返回update语句的id。大概,如果您已经根据ID进行了更新,那么您就有了ID,所以在更新之后只需根据ID进行选择。

    编辑:我不是建议您在更新时修改id列,我只是说这是MySQL_insert_id将返回更新查询值的唯一情况。

    对注释的响应:那么您应该做的是,首先选择通过登录/密码获取行的ID,然后根据选择结果中的行的ID进行更新。

        4
  •  0
  •   Poni    16 年前

    为了澄清,忘记我最初发布的代码-以下是我需要的简单方法:

    首先,我更新: 更新db_test.tbl_test 设置所有者ID=55 其中login='user_name'和passwd='password'以及owner_id=-1

    然后我检查是否有任何行被更新,使用mysql_-affected_rows()进行更新。如果它是一个(不能是更多,因为字段“login”是唯一的),那么我想获取此行的ID,而不只是执行另一个选择。

    这背后的逻辑是什么? 它将是一个多播放器数据库存储,有几个服务器。 我需要以某种方式强制一个玩家每次只能登录一次。 这是通过锁定它的帐户来完成的;“-1”的“所有者ID”表示一个可自由玩的帐户,如果不是,则表示该玩家已经在玩了。

    希望现在能清楚一点。

        5
  •  0
  •   fancyPants    13 年前

    Poni,我想 mysql_affected_rows() 您的职能是:

    mysql_-affected_rows()可以在执行 带有mysql_query()或mysql_real_query()的语句。它返回 最后一条语句更改、删除或插入的行数,如果 它是更新、删除或插入。对于select语句, mysql_-affected_rows()的工作方式与mysql_num_rows()类似。