免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 北京野狼
打印 上一主题 下一主题

[数据库] 请教mysql的mysql_insert_id函数。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-10-12 21:49 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

每个程序里打开一个连接,

mysql_insert_id取回的是当然连接的insert_id值,而不是Mysql中最新的insert_id值。所以,同一个程序,并发运行了,也许有几个线程同时在insert,但是,每个线程的mysql_insert_id返回的是自己线程的insert_id值,不会返回其它线程insert后的insert_id

insert_id的生成,由Mysql来处理,处理并发,对数据库来说是小意思啦。


mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。

我也是由上面的话猜想的,没有测试。

论坛徽章:
0
12 [报告]
发表于 2005-10-12 22:04 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

所以好多PHP的DB抽象类库都是用自建表来"模拟"唯一增长列的值~

插入目标表前, 锁定并读出自建表的最大ID值, 以此值为准插入, 并返回此值


当然, 这更多是为了兼容性打算

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2005-10-13 10:18 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

[quote]原帖由 "tonera"][/quote 发表:


事实上的结果是mysql_insert_id决不会取错。

甚至我mysql_query("insert.....);之后立刻sleep(1100)

然后在mysql_insert_id取的值都不会和其他的冲突

论坛徽章:
0
14 [报告]
发表于 2005-10-13 11:33 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

应该是不会错的,

mysql_insert_id只取当前进程运行insert返回的insert_id,与MYSQL的并发处理无关。

论坛徽章:
0
15 [报告]
发表于 2005-10-13 14:23 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

在这里能学到很多东西啊
可惜就是人气少了点

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2005-10-13 16:21 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

看了半天mysql的代码。mysql_insert_id是这么定义的
my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
{
  return mysql->;last_used_con->;insert_id;
}


在MYSQL结构体里面有insert_id。

原帖由 "" 发表:

typedef struct st_mysql
{
  NET           net;                    /* Communication parameters */
  gptr          connector_fd;           /* ConnectorFd for SSL */
  char          *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
  char          *db;
  struct charset_info_st *charset;
  MYSQL_FIELD   *fields;
  MEM_ROOT      field_alloc;
  my_ulonglong affected_rows;
  my_ulonglong insert_id;               /* id if insert on table with NEXTNR */
  my_ulonglong extra_info;              /* Used by mysqlshow */
  unsigned long thread_id;              /* Id for connection in server */
  unsigned long packet_length;         
  unsigned int  port;
  unsigned long client_flag,server_capabilities;
  unsigned int  protocol_version;
  unsigned int  field_count;
  unsigned int  server_status;
  unsigned int  server_language;
  unsigned int  warning_count;
  struct st_mysql_options options;
  enum mysql_status status;
  my_bool       free_me;                /* If free in mysql_close */
  my_bool       reconnect;              /* set to 1 if automatic reconnect */
  
  /* session-wide random string */
  char          scramble[SCRAMBLE_LENGTH+1];
  
/*
   Set if this is the original connection, not a master or a slave we have
   added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
*/
  my_bool rpl_pivot;
  /*
    Pointers to the master, and the next slave connections, points to
    itself if lone connection.
  */
  struct st_mysql* master, *next_slave;

  struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
/* needed for send/read/store/use result to work correctly with replication */
  struct st_mysql* last_used_con;

  LIST  *stmts;                     /* list of all statements */
  const struct st_mysql_methods *methods;
  void *thd;
  /*
    Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag
    from mysql_stmt_close if close had to cancel result set of this object.
  */
  my_bool *unbuffered_fetch_owner;
} MYSQL;



的确是针对当前连接的,而每次mysql_query操作在mysql服务器上可以理解为一次“原子”操作

论坛徽章:
0
17 [报告]
发表于 2005-10-13 16:55 |只看该作者

[数据库] 请教mysql的mysql_insert_id函数。

pconnect的情况也是一样?

论坛徽章:
0
18 [报告]
发表于 2005-11-04 16:50 |只看该作者

举个例子子吧

<?php
    $con = mysql_connect("localhost", "mysql_user", "mysql_password")
    if($con)
       mysql_select_db("mydb");
    else
          echo mysqsl_error();

    mysql_query("insert into mytable (product) values ('kossu')");
    printf ("Last inserted record has id %d\n", mysql_insert_id());
?>

论坛徽章:
0
19 [报告]
发表于 2005-11-04 22:39 |只看该作者
北京野狼   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP