教程集 www.jiaochengji.com
教程集 >  数据库  >  mysql  >  正文 mysql怎么获取自增id示例代码

mysql怎么获取自增id示例代码

发布时间:2016-05-29   编辑:jiaochengji.com
本文介绍了mysql数据库自增id的获取方法,通过实例学习mysql怎么取得数据库自增id值,有需要的朋友参考下。

如何获取到MySQL 的自增id,为大家做一个总结,可以通过四种方式来获取MySQL 的自增id。

一,last_insert_id()
官方介绍:
“The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. ”

last_insert_id() 单个会话中最近一次执行的insert语句时表的自增id的值。不受其他的会话插入影响。

如果是新建的表,它的值为0
 

复制代码 代码示例:
root@rac3 [yangyi]> create table t2(id int not null auto_increment primary key ,col varchar(10));                                   
Query OK, 0 rows affected (0.11 sec)
root@rac3 [yangyi]> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                0 |
+------------------+
1 row in set (0.01 sec)

如果向表中插入的记录,id自增,它的值为max(id),如果指定插入的id ,它的值为上一次插入的最大值。
 

复制代码 代码示例:

root@rac3 [yangyi]> insert into t3 values(null,'sss');
Query OK, 1 row affected (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();        
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)
root@rac3 [yangyi]> insert into t3 values(2,'sss'); 
Query OK, 1 row affected (0.00 sec)
root@rac3 [yangyi]> select last_insert_id();     
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!
 

复制代码 代码示例:

root@rac3 [yangyi]> select last_insert_id();       
+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.01 sec)
root@rac3 [yangyi]> insert into t1 values(null,'sss'),(null,'dd'),(null,'aaa');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
root@rac3 [yangyi]> select * from t1;
+----+------+
| id | col  |
+----+------+
|  1 | sss  |
|  2 | sss  |
|  3 | sss  |
|  4 | sss  |
|  5 | dd   |
|  6 | aaa  |
+----+------+
6 rows in set (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                4 |
+------------------+
1 row in set (0.00 sec)

last_insert_id 是与表无关的,如果向表a插入数据后,再向表b插入数据,last_insert_id 返回表b的Id值!
 

复制代码 代码示例:
root@rac3 [yangyi]> insert into t2 values(null,'sss');
Query OK, 1 row affected (0.00 sec)
root@rac3 [yangyi]> select last_insert_id();        
+------------------+
| last_insert_id() |
+------------------+
|               11 |
+------------------+
1 row in set (0.00 sec)
root@rac3 [yangyi]> insert into t1 values(null,'sss');
Query OK, 1 row affected (0.00 sec)
root@rac3 [yangyi]> select @@identity;              
+------------+
| @@identity |
+------------+
|          3 |
+------------+
1 row in set (0.00 sec)

二,使用@@identity

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。
其特性last_insert_id 一样.

三,使用max(id)
  select max(id) from tab; 返回的是tab 的最大id值。
  使用max(id) 只能针对单个表获取最大的id,而且高并发情况下,必须加上'X' 锁才能获取会话当前的最大id,显然加锁会严重影响并发性能。

四,查看表结构
 

复制代码 代码示例:

root@rac3 [yangyi]> show table  status like 't3' \G
*************************** 1. row ***************************
           Name: t3
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 2
Avg_row_length: 8192
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
Auto_increment: 3
    Create_time: 2014-05-06 20:36:00
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
Create_options:
        Comment:
1 row in set (0.00 sec)

root@rac3 [yangyi]> show create table t3 \G                   
*************************** 1. row ***************************
       Table: t3
Create Table: CREATE TABLE `t3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col` varchar(10) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

五,总结
MySQL使用auto_increment 属性来实现自增id,这与oracle中sequence不同。
auto_increment 是基于表的而非全局。
从oracle 到mysql 的dba 要注意改变对sequence 使用方式的转变。

您可能感兴趣的文章:
MySQL 表字段唯一性约束设置与字段自增的设置方法
Mysql 自增字段设定基值的sql语句
PHP获取Mysql插入记录ID
mysql怎么获取自增id示例代码
PHP取得当前插入数据库记录id值
Mysql 主键自增长auto_increment问题分析
mysql随机查询的经验分享
解析mysql实现随机查询的几种方法
mysql事务实现并发安全的自增ID的方法
深入解析mysql自增字段auto_commit

关键词: mysql自增  字段自增   
[关闭]
~ ~