转自:http://hi.baidu.com/zuccxy/blog/item/037fb71eebf0848186d6b6cd.html
我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,
一般情况下获取刚插入的数据的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返回一个列表。
LAST_INSERT_ID
自动返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的第一个发生的值. 参考这里
The ID that was generated is maintained in the server on aper-connection basis.
LAST_INSERT_ID是基于单个connection的,不可能被其它的客户端连接改变。
可以用SELECTLAST_INSERT_ID(); 查询LAST_INSERT_ID的值.
Important: If you insert multiple rows using a singleINSERT
statement,LAST_INSERT_ID()
returns
the value generated for thefirstinserted rowonly.
使用单INSERT语句插入多条记录,LAST_INSERT_ID只返回插入的第一条记录产生的值. 比如
mysql>INSERTINTOtVALUES(NULL, ‘aaaa’), (NULL,
‘bbbb’), (NULL, ‘cccc’);
mysql>SELECT*FROMt;
+—-+——+
| id |name|
+—-+——+
| 1 | Bob |
| 2 | aaaa |
| 3 | bbbb |
| 4 | cccc |
+—-+——+
mysql>SELECTLAST_INSERT_ID();
+——————+
|LAST_INSERT_ID() |
+——————+
| 2 |
+——————+
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 而不用担心其它客户端的活动,而且不需要加锁。
(3)select @@IDENTITY:
String sql=”select @@IDENTITY”;
@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select
@@identity的时候连接没有关闭,否则得到的将是NULL值。
相关推荐
在关系型数据库中,如MySQL、SQL Server或Oracle,我们可以使用内置的自动递增(Auto Increment)或序列(Sequence)功能来生成自动编号。例如,在SQL Server中,可以创建一个具有Identity属性的列,它会在每次插入...
- **获取每个订单商户编号**:查询订单中的商户ID。 - **更新商户收入总额**:将所有订单的金额汇总,得到每个商户的总收入。 - **商户收入对账**:确保所有订单的收入正确无误。 2. **统计客户消费情况** - **...
这个存储过程首先获取`users`表中当前的最大`id`,然后插入一个新的用户记录,`id`值为最大`id`加1,确保了编号的连续性。 在Java环境中,我们可以使用JDBC(Java Database Connectivity)来调用这个存储过程。以下...
例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为的名为Tom的成绩为.45, 编号为 的名为Joan 的成绩为.99,编号为 的名为Wang 的成绩为.5. mysql>insert into MyClass values(1,’Tom’,96.45),(2,’Joan...
MySQL的`LAST_INSERT_ID()`函数可以获取自增字段生成的最后一个编号,这对于跟踪插入操作非常有用。但是,这个函数只与当前会话相关,如果在会话中没有生成新的自增值,它将返回0。 对于其他类型的数据表,如MyISAM...
2. 插入数据到doctor表,自增字段doc_id在插入时可以设置为null,系统会自动赋予一个唯一的值。 3. 创建department表,包含dep_id(主键)、dep_name和dep_addr。 4. 插入数据到department表。 5. 创建视图doc_view...
接着,使用`CREATE TABLE`来定义表结构,如创建一个班级表`grade`,包含编号(id)、姓名(name)、邮件(email)、评分(point)和注册日期(regdate)等字段。字段的定义需要注意类型、长度和约束,例如`id`字段为无符号整数...
例如,在`insect`表的创建中,`id`列被设置为自动递增,所以即使在插入记录时没有提供`id`值,MySQL也会自动生成并填充。 2. **插入数据**: 插入数据时,可以省略带有 AUTO_INCREMENT 属性的列的值。在上面的例子...
通常包括数据库连接、SQL语句(如`SELECT MAX(order_id) FROM orders`)、订单编号生成逻辑以及插入新订单的代码。 - 可能会包含错误处理和日志记录,以便在出现问题时追踪和调试。 5. **`README.txt`**: - 这个...
在Oracle数据库中,我们可以使用`CREATE SEQUENCE`语句来定义一个序列,然后在插入新记录时使用`NEXTVAL`函数获取序列的下一个值。例如: ```sql CREATE SEQUENCE seq_user_id START WITH 1 INCREMENT BY 1; ``` ...
在数据库操作中,有时我们需要在插入新记录时确保某个字段的值是当前数据库中该字段的最大值加上1,以此来实现自动序列化或保持唯一性。这种需求在诸如订单编号、ID序列等场景中十分常见。本文将详细介绍如何通过`...
这个触发器会在每次向`demo_1`中添加一条记录时,获取最新添加的`ID`,并将该学生的信息(ID和默认数学成绩98.5)插入到`demo_2`中。 为了实现对触发器的控制,我们可以修改触发器的逻辑,添加一个变量`@enable_...
11. 在MySQL中,`AUTO_INCREMENT`属性使得id字段自动递增,即使插入特定值,后续插入仍会递增,因此“张良”的客户编号是22501。 12. 查找15天前的记录应使用表达式`()-15`,因此B选项正确。 13. 在面向对象编程中,...
6. **错误处理与日志记录**:为了确保程序的健壮性,需要添加适当的错误处理机制,捕获并记录可能发生的异常。使用`try-catch`块和日志框架如Log4j或Java内置的`java.util.logging.Logger`,可以跟踪和诊断运行时...
因此,在执行完“李明”的插入操作后,即使“张良”的`id`字段被指定为0,系统也会自动为其分配下一个递增值22501。 ### 文本框属性 22. **知识点**: 文本框中选定的内容由`SelText`属性反映。 - **解释**: 在...
例如,创建一个名为“cnartile”的表,包含字段“cn_id”(自动编号,设为主键)、“cn_title”(文本类型)、“cn_content”(备注类型,可容纳大量文本)、“cn_author”(文本类型,允许空值)和“cn_time”...
- 使用Django自带的admin站点管理数据库记录。 - 可自定义显示字段、过滤条件等。 - **基本数据访问** - **插入数据** - 创建模型实例并调用save方法。 - **查询数据** - 使用模型类的方法进行查询,如filter...
oracle 甲骨文 获得最高认证级别的ISO标准安全认证,性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。但价格不菲 大型企业 db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2...