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值。
分享到:
相关推荐
- **InnoDB**:存储在内存中的自动增长ID值,在MySQL服务重启后会重置。不过,InnoDB支持使用`OPTIMIZE TABLE`命令来恢复已删除记录所留下的空缺ID。 #### 二、删除记录后重新插入时ID的变化情况 假设有一张表`...
执行完成后,`order`对象的`id`属性将会被自动填充为刚刚插入记录的自增长ID值。 这个机制对于需要跨表关联的场景特别有用,比如在上述例子中,当我们在订单表中插入客户信息后,可以获取到新生成的订单ID,并将其...
在MySQL数据库管理中,自增长主键是一种常见的设计模式,主要用于自动为每一行记录生成一个唯一的标识符。然而,这种自增长通常与整型数据类型(如INT)关联,而较少见于字符型数据(如CHAR)。本文将深入探讨如何在...
- **标准方法:** 使用`INSERT`语句插入数据后,可以通过`LAST_INSERT_ID()`函数或`getGeneratedKeys()`方法来获取刚插入记录的自增ID。 - **示例代码:** 下面的Java示例展示了如何使用JDBC API来插入一条记录并...
这意味着如果你在同一事务中多次插入数据,那么每次插入后都需要分别查询`CURRVAL`来获取刚插入的ID值。 #### 总结 通过序列和触发器,Oracle可以很好地支持在插入数据时自动生成并获取ID的需求。这种方式不仅提高...
在实际应用中,我们经常需要对数据进行自增长和时间戳记录,本文将详细介绍 MySQL 中的自增长和时间字段的使用。 自增长字段 在 MySQL 中,我们可以使用 auto_increment 属性来实现字段的自增长。例如,在创建用户...
本文将详细介绍如何在Oracle中实现ID自增长,并通过具体的步骤和示例代码来进行演示。 #### 二、Oracle ID自增长原理及实现步骤 ##### 1. 创建表 首先,我们需要创建一个表,该表将用于存储我们的数据。在这个...
在MySQL中,`@@IDENTITY`是一个系统变量,它返回最后一次执行的自动增长字段的值。这个特性在执行插入操作后获取新插入记录的ID时非常有用。例如,在上面的代码中,使用了`@@IDENTITY`来获取刚刚插入的记录ID: ```...
为了获取这个值,我们需要在插入语句中使用`LAST_INSERT_ID()`函数,并在`Statement`对象上设置`RETURN_GENERATED_KEYS`属性: ```java try (Connection conn = DriverManager.getConnection(url, user, password))...
MySQL中的自增长键是一种特殊类型的字段,主要用于主键,它能自动递增其数值,无需在插入新记录时显式指定。自增长键对于数据库管理非常有用,因为它简化了插入操作,尤其是当需要唯一标识符时。理解自增长键的工作...
每次插入新行时,MySQL会自动为`id`列分配下一个可用的值。`AUTO_INCREMENT`的初始值可以调整,以满足特定需求。 相比之下,Oracle不支持直接在创建表时设置自动增长列。要实现类似功能,需要先创建一个序列对象,...
在 MySQL 中,需要使用 `useGeneratedKeys="true"` 和 `keyProperty="id"` 来获取自增长主键。例如: ```xml <insert id="insertByBatch" useGeneratedKeys="true" keyProperty="id" parameterType="java.util.List...
在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是Oracle提供的一种用于生成一系列唯一数值的对象,非常适合用来作为表中的主键值。 #...
在MySQL数据库中,自增长(auto_increment)特性通常用于创建序列化的标识符,这在插入新记录时非常有用,因为它可以自动为新行提供唯一的标识。然而,许多初学者误以为自增长特性只能应用于主键,实际上,MySQL允许...
总结起来,通过在MyBatis的Mapper XML文件中配置`useGeneratedKeys`和`keyProperty`,或者使用`<selectKey>`标签,我们可以轻松地在Java应用中获取MySQL插入记录时自动生成的主键值。这种方式不仅简化了编程,也提高...
总结来说,MySQL的自动增长特性与SQL Server有所不同,它需要与主键结合使用,并提供了`last_insert_id()`函数来获取最近插入记录的自动增长ID。在插入数据时,我们可以灵活地处理自动增长字段,包括设置默认值、...
在传统的SQL数据库如MySQL中,可以设置特定字段为自动增长(AUTO_INCREMENT),每次插入新记录时,该字段的值会自动递增。然而,这种机制在分布式系统或高并发环境下可能无法满足需求,因为单个数据库实例可能无法...
在SQL数据库中,通常存在自动增长的主键概念,例如MySQL中的`AUTO_INCREMENT`字段,它能确保每行记录的主键值独一无二并自动递增。然而,MongoDB并没有内置这样的功能,其默认的`_id`字段是一个由12字节组成的唯一...
在PHP编程中,当我们在MySQL数据库中执行插入操作时,经常需要获取新插入记录的唯一标识,即自动增长的ID。`mysql_insert_id()`函数就是为了解决这一问题而设计的。它允许开发者在成功执行一个INSERT语句后,获取到...