mysql的last_insert_id()用法

jackxiang 2008-10-21 18:50 | |
最近在做一个小东西的时候,发现mysql有last_insert_id()这个函数

它的用法如下:记录下来备忘

它必需紧跟在insert 语句执行之后。

//执行insert语句先

$sql="insert into table (name1,name2,...) values('value1','values'...)";

dbx_query($db_link,$sql);

//找出最后一次插入记录的id

$select="select last_insert_id() ";

$result=dbx_query($db_link,$select);

$last_id=$result->data[0][0];


ps: $last_id=mysql_insert_id();

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

具体的请看php手册: mysql_insert_id

来自:http://blog.csdn.net/kemy88/article/details/1108524








_____________________________________________________________________________
show table status\G
show create table message;
LAST_INSERT_ID

自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里

The ID that was generated is maintained in the server on a per-connection basis.

LAST_INSERT_ID是基于单个connection的, 不可能被其它的客户端连接改变。

可以用 SELECT LAST_INSERT_ID(); 查询LAST_INSERT_ID的值.

Important: If you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only.

使用单INSERT语句插入多条记录,  LAST_INSERT_ID只返回插入的第一条记录产生的值. 比如


   1. mysql> INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc');  
   2. mysql> SELECT * FROM t;  
   3. +----+------+  
   4. | id | name |  
   5. +----+------+  
   6. |  1 | Bob  |  
   7. |  2 | aaaa |  
   8. |  3 | bbbb |  
   9. |  4 | cccc |  
  10. +----+------+  
  11. mysql> SELECT LAST_INSERT_ID();  
  12. +------------------+  
  13. | LAST_INSERT_ID() |  
  14. +------------------+  
  15. |                2 |  
  16. +------------------+  


ID 2 是在插入第一条记录aaaa 时产生的.

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。

但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。

这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。

mysql的last_insert_id()不可靠 Mysql的API有个很有意义的函数last_insert_id()。这个函数的作用是,针对auto_increment字段,返回给定的 数据库链接,上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定数据库链接,则使用上一个打开的连接。   很多人质疑last_insert_id()是否是可靠的,以前我也犹豫过。   事实上的结果是mysql_insert_id决不会取错。首先做个测试,在mysql_query("insert.....);之后立刻sleep(1100),其间再做些其他的insert. 然后发现在mysql_insert_id取的值都不会和其他的冲突。   看了半天mysql的代码。mysql_insert_id是这么定义的

my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql) {   return mysql->;last_used_con->;insert_id; }


参考:http://zhaohe162.blog.163.com/blog/static/38216797201122411193745/

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1317/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-5-13 23:59
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]