`
张玉龙
  • 浏览: 737205 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Mysql 中获取刚插入的自增长id的值

 
阅读更多

insert into user (username,password) VALUES ('zyl','123');
select last_insert_id();
获取刚插入的自增长id的值















在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成“主从表结构”,这是数据库设计中常见的用法。但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录。这里面有个困难,就是插入主表记录后,如何获得它对应的id。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以“X锁“,待获得max(id)的值以后,再解锁。这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAST_INSERT_ID()这个操作。乍一看,它和select max(id)很象,但实际上它是线程安全的。也就是说它是具体于数据库连接的。下面通过实验说明:

  1、在连接1中向A表插入一条记录,A表包含一个auto_increment类型的字段。

  2、在连接2中向A表再插入一条记录。

  3、结果:在连接1中执行select LAST_INSERT_ID()得到的结果和连接2中执行select LAST_INSERT_ID()的结果是不同的;而在两个连接中执行select max(id)的结果是相同的。

  其实在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的区别和这里是类似的。使用SCOPE_IDENTITY()可以获得插入某个IDENTITY字段的当前会话的值,而使用IDENT_CURRENT()会获得在某个IDENTITY字段上插入的最大值,而不区分不同的会话。

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

  insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。

 

最后有个问题一直没解决:

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





















我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,

一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。
但在多线程情况下,就不行了。

下面介绍三种方法

(1) getGeneratedKeys()方法:

程序片断:
	Connection conn = ;
	        Serializable ret = null;
	        PreparedStatement state = .;
	        ResultSet rs=null;
	        try {
	            state.executeUpdate();
	            rs = state.getGeneratedKeys();
	            if (rs.next()) {
	                ret = (Serializable) rs.getObject(1);
	            }      
	        } catch (SQLException e) {
	        }
	        return ret;

(2)LAST_INSERT_ID:

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

在多用户交替插入数据的情况下max(id)显然不能用。
这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录,  LAST_INSERT_ID返回一个列表。

(3)select @@IDENTITY:
显示代码
打印
	String sql="select @@IDENTITY";

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。










分享到:
评论
2 楼 sybell 2014-01-27  
讲得好,但得试一下有没有错。
1 楼 nizen 2013-07-16  
不错,有用!

相关推荐

    mysql的插入问题 怎么获得自动增长的ID

    - **InnoDB**:存储在内存中的自动增长ID值,在MySQL服务重启后会重置。不过,InnoDB支持使用`OPTIMIZE TABLE`命令来恢复已删除记录所留下的空缺ID。 #### 二、删除记录后重新插入时ID的变化情况 假设有一张表`...

    mybatis 获取mysql插入记录的自增长字段值.pdf

    执行完成后,`order`对象的`id`属性将会被自动填充为刚刚插入记录的自增长ID值。 这个机制对于需要跨表关联的场景特别有用,比如在上述例子中,当我们在订单表中插入客户信息后,可以获取到新生成的订单ID,并将其...

    mysql实现char类型主键自增长

    在MySQL数据库管理中,自增长主键是一种常见的设计模式,主要用于自动为每一行记录生成一个唯一的标识符。然而,这种自增长通常与整型数据类型(如INT)关联,而较少见于字符型数据(如CHAR)。本文将深入探讨如何在...

    mysql取得自动增长的主键值

    - **标准方法:** 使用`INSERT`语句插入数据后,可以通过`LAST_INSERT_ID()`函数或`getGeneratedKeys()`方法来获取刚插入记录的自增ID。 - **示例代码:** 下面的Java示例展示了如何使用JDBC API来插入一条记录并...

    Oracle插入数据时获取自增ID

    这意味着如果你在同一事务中多次插入数据,那么每次插入后都需要分别查询`CURRVAL`来获取刚插入的ID值。 #### 总结 通过序列和触发器,Oracle可以很好地支持在插入数据时自动生成并获取ID的需求。这种方式不仅提高...

    mysql 自增长 时间字段

    在实际应用中,我们经常需要对数据进行自增长和时间戳记录,本文将详细介绍 MySQL 中的自增长和时间字段的使用。 自增长字段 在 MySQL 中,我们可以使用 auto_increment 属性来实现字段的自增长。例如,在创建用户...

    OracleID自增长

    本文将详细介绍如何在Oracle中实现ID自增长,并通过具体的步骤和示例代码来进行演示。 #### 二、Oracle ID自增长原理及实现步骤 ##### 1. 创建表 首先,我们需要创建一个表,该表将用于存储我们的数据。在这个...

    MySQL查询插入语句

    在MySQL中,`@@IDENTITY`是一个系统变量,它返回最后一次执行的自动增长字段的值。这个特性在执行插入操作后获取新插入记录的ID时非常有用。例如,在上面的代码中,使用了`@@IDENTITY`来获取刚刚插入的记录ID: ```...

    jdbc 插入记录并返回自增主键值

    为了获取这个值,我们需要在插入语句中使用`LAST_INSERT_ID()`函数,并在`Statement`对象上设置`RETURN_GENERATED_KEYS`属性: ```java try (Connection conn = DriverManager.getConnection(url, user, password))...

    MySQL自增长键理解

    MySQL中的自增长键是一种特殊类型的字段,主要用于主键,它能自动递增其数值,无需在插入新记录时显式指定。自增长键对于数据库管理非常有用,因为它简化了插入操作,尤其是当需要唯一标识符时。理解自增长键的工作...

    Oracle与Mysql自动增长列(id)的区别

    每次插入新行时,MySQL会自动为`id`列分配下一个可用的值。`AUTO_INCREMENT`的初始值可以调整,以满足特定需求。 相比之下,Oracle不支持直接在创建表时设置自动增长列。要实现类似功能,需要先创建一个序列对象,...

    Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    在 MySQL 中,需要使用 `useGeneratedKeys="true"` 和 `keyProperty="id"` 来获取自增长主键。例如: ```xml <insert id="insertByBatch" useGeneratedKeys="true" keyProperty="id" parameterType="java.util.List...

    oracle主键自动增长

    在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是Oracle提供的一种用于生成一系列唯一数值的对象,非常适合用来作为表中的主键值。 #...

    mysql非主键自增长用法实例分析

    在MySQL数据库中,自增长(auto_increment)特性通常用于创建序列化的标识符,这在插入新记录时非常有用,因为它可以自动为新行提供唯一的标识。然而,许多初学者误以为自增长特性只能应用于主键,实际上,MySQL允许...

    利用Java的MyBatis框架获取MySQL中插入记录时的自增主键

    总结起来,通过在MyBatis的Mapper XML文件中配置`useGeneratedKeys`和`keyProperty`,或者使用`<selectKey>`标签,我们可以轻松地在Java应用中获取MySQL插入记录时自动生成的主键值。这种方式不仅简化了编程,也提高...

    MySQL自学文档第三周

    总结来说,MySQL的自动增长特性与SQL Server有所不同,它需要与主键结合使用,并提供了`last_insert_id()`函数来获取最近插入记录的自动增长ID。在插入数据时,我们可以灵活地处理自动增长字段,包括设置默认值、...

    java快速ID自增器

    在传统的SQL数据库如MySQL中,可以设置特定字段为自动增长(AUTO_INCREMENT),每次插入新记录时,该字段的值会自动递增。然而,这种机制在分布式系统或高并发环境下可能无法满足需求,因为单个数据库实例可能无法...

    MongoDB的_id自动增长.pdf

    在SQL数据库中,通常存在自动增长的主键概念,例如MySQL中的`AUTO_INCREMENT`字段,它能确保每行记录的主键值独一无二并自动递增。然而,MongoDB并没有内置这样的功能,其默认的`_id`字段是一个由12字节组成的唯一...

    PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID

    在PHP编程中,当我们在MySQL数据库中执行插入操作时,经常需要获取新插入记录的唯一标识,即自动增长的ID。`mysql_insert_id()`函数就是为了解决这一问题而设计的。它允许开发者在成功执行一个INSERT语句后,获取到...

Global site tag (gtag.js) - Google Analytics