select (@rowNO := @rowNo+1) AS rowno,s.com_uid from (select com_uid from sms_balance) s,(select @rowNO :=0) b ;
或者 获取最大的编号,然后加1 再保存到数据库中.
产生自定义格式的自动增长序列号:
- /**
- * 自己维护的序列号,至少从1开始增长
- */
- public abstract class IncrementNumber {
- public IncrementNumber() {}
- public IncrementNumber(int interval, int maxNum) {
- this.interval = interval;
- this.maxNum = maxNum;
- }
- public synchronized int cal() throws Exception {
- if (serialNum == -1) {
- serialNum = initStartNum(); // 已经使用的序列号一定 小于 缓存的序列号
- intervalMax = serialNum + interval;
- updateStartNum(intervalMax);
- return serialNum;
- }
- if (isMax(serialNum)) { // 达到预定的最大值
- resetSerialNum();
- return serialNum;
- }
- serialNum++;
- if (serialNum >= (intervalMax - 1)) { // 到达区间最大值
- intervalMax += interval;
- updateStartNum(intervalMax);
- }
- return serialNum;
- }
- /**
- * 初始化序列号,从缓存系统中来,比如数据库、文件等
- * @return 初始序列号
- * @throws Exception
- */
- public abstract int initStartNum() throws Exception;
- /**
- * 更新区间最大值到缓存系统,比如数据库、文件中。
- * @param intervalMax 区间最大值
- * @throws Exception
- */
- public abstract void updateStartNum(int intervalMax) throws Exception;
- /**
- * 重置序列号,从1开始
- */
- protected void resetSerialNum() throws Exception {
- this.serialNum = 1;
- intervalMax = serialNum + interval;
- updateStartNum(intervalMax);
- }
- /**
- * 是否是最大值
- * @param num
- * @return
- */
- private boolean isMax(int num) {
- return num >= maxNum;
- }
- public int getInterval() {
- return this.interval;
- }
- public int getMaxNum() {
- return this.maxNum;
- }
- /** 区间最大值 */
- protected int intervalMax = 0;
- /** 每次增加量 */
- protected int interval = 20;
- /** 预定的最大值 */
- protected int maxNum = 9999;
- /** 序列号 */
- protected int serialNum = -1;
- }
使用方法:
- @Service
- @Transactional
- public class TableKeyManager extends IncrementNumber {
- public TableKeyManager() {
- super(100, 99999999);
- }
- @Override
- public int initStartNum() throws Exception {
- TableKey tableKey = tableKeyDao.getById(name);
- date = DateConvertUtils.getDayEnd(DateConvertUtils.parse(tableKey.getDate(), "yyMMdd"));
- dateEndMillis = date.getTime();
- prefix = tableKey.getDate();
- return (int) tableKey.getMaxNum();
- }
- @Override
- public void updateStartNum(int intervalMax) throws Exception {
- TableKey tableKey = tableKeyDao.getById(name);
- tableKey.setDate(DateConvertUtils.format(new Date(dateEndMillis), "yyMMdd"));
- tableKey.setMaxNum(intervalMax);
- tableKeyDao.update(tableKey);
- }
- public String getNum() {
- try {
- long now = System.currentTimeMillis();
- int no = 0;
- if (now > dateEndMillis) {
- date = DateConvertUtils.getDayEnd(new Date(now));
- dateEndMillis = date.getTime();
- prefix = DateConvertUtils.format(date, "yyMMdd");
- resetSerialNum();
- no = this.serialNum;
- } else {
- no = cal();
- }
- return prefix + ApplicationUtil.getFixedSizeNum(no, 8);
- } catch (Exception e) {
- e.printStackTrace();
- }
- throw new RuntimeException("生成序列号错误");
- }
- public void setName(String name) {
- this.name = name;
- }
- private String prefix = null;
- private long dateEndMillis = 0l;
- private Date date = null;
- private String name;
- @Autowired
- private TableKeyDao tableKeyDao;
- }
这种方法仅在初始化时查询一次数据库,在每次到达增长上限时,计数自动叠加一个步长,同时更新数据库中的数据上限。
table_key的数据结构
- CREATE TABLE `table_key` (
- `key_name` varchar(100) NOT NULL COMMENT '需要维护的key名称',
- `cur_no` mediumtext COMMENT '当前数据编号',
- `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据编号更新时间',
- `create_time` datetime DEFAULT NULL COMMENT '记录创建时间',
- PRIMARY KEY (`key_name`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回的就是expr的值。下面演示该方法的具体操作:
先创建一个只有一个数据行的数据表:create table seq_table (id int unsigned not null);insert into seq_table values (0);接着用以下操作检索出序列号:
update seq_table set seq = LAST_INSERT_ID( seq + 1 );select LAST_INSERT_ID();
通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作.
相关推荐
mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-connector-java-5.1.49 mysql57驱动jar包mysql-...
MySQL Connector/J 充当了 JDBC 驱动的角色,使得 Java 应用能够连接到 MySQL 数据库,执行查询、插入、更新和删除等操作。 MySQL Connector/J 5.1.23 的主要特性包括: 1. **全面支持 JDBC 4.0 规范**:该版本的...
mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 jar包 mysql-connector-java-8.0.27 ...
Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用Java作业mysql应用
### MySQL的插入问题:如何获取自动增长的ID 在MySQL中,经常需要用到自动增长的ID字段作为表的主键,特别是在频繁进行数据插入操作时。本文将深入探讨以下几个方面: 1. **理解自动增长ID的工作原理** 2. **在...
首先,`mysql-connector-java-5.1.45`包含了一系列的Java类和接口,它们实现了JDBC(Java Database Connectivity)API。JDBC是Java中用于与各种数据库进行交互的一组标准接口,允许开发人员在不关心底层数据库实现的...
此外,本文还提供了一些相关的学习资源,例如《Java+MySQL数据库程序设计总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》,这些资源...
首先,要连接Java和MySQL,我们需要引入MySQL的JDBC驱动。这通常通过在项目的类路径中添加`mysql-connector-java.jar`库来完成。这个库包含Java代码,可以理解MySQL特定的通信协议并处理与数据库的交互。 在Java...
【作品名称】:基于Mysql和JAVA的股票交易系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于Mysql和JAVA的...
这个驱动程序,也就是`mysql-connector-java`,是一个JDBC(Java Database Connectivity)驱动,它实现了Java.sql接口,使得Java开发者能够使用标准的JDBC API来连接、查询和操作MySQL数据库。 标题"mysql-...
Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI+MySQL),Java学生信息管理系统(GUI...
### MySQL获取自动增长的主键值 在MySQL数据库中,自动增长...通过以上知识点的学习,我们可以更好地理解和掌握MySQL中获取自动增长主键值的方法及其应用场景,这对于日常的数据库管理和应用开发都有着重要的意义。
这个版本的驱动兼容MySQL 5.1系列数据库,包含必要的类和方法,使Java应用能够执行SQL语句、处理结果集等数据库操作。 使用这个驱动包的过程通常包括以下几个步骤: 1. **添加依赖**:将`mysql-connector-java-...
在实际应用中,我们经常需要对数据进行自增长和时间戳记录,本文将详细介绍 MySQL 中的自增长和时间字段的使用。 自增长字段 在 MySQL 中,我们可以使用 auto_increment 属性来实现字段的自增长。例如,在创建用户...
在这个"java连接mysql demo和所有jar"的压缩包中,包含了实现这一功能所需的示例代码和必要的库文件。下面我们将深入探讨相关知识点。 首先,Java连接MySQL主要依赖于`JDBC`(Java Database Connectivity),它是...
MySQL是世界上最流行的开源关系型数据库管理系统之一,而Java是一种广泛使用的多平台开发语言,两者结合使用,通过Java Database Connectivity (JDBC) API,可以实现Java应用程序与MySQL数据库之间的交互。...
mysql-connector-java-5.0.5.jar mysql-connector-java-5.1.6.jar mysql-connector-java-5.1.18.jar mysql-connector-java-5.1.21.jar mysql-connector-java-5.1.35.jar mysql-connector-java-5.1.39.jar mysql-...
本文将深入探讨这两个文件:"mysql-connector-java-5.1.40.zip" 和 "mysql-connector-java-5.1.10.jar",以及它们在Java开发中的作用。 首先,`mysql-connector-java-5.1.40.zip` 是一个压缩文件,包含了MySQL ...
开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin开发工具 mysql-connector-java-5.1.40-bin...