0
点赞
收藏
分享

微信扫一扫

mysql 和 java 自增长序号


select  (@rowNO := @rowNo+1) AS rowno,s.com_uid from (select  com_uid from sms_balance) s,(select @rowNO :=0) b ;

 

或者 获取最大的编号,然后加1  再保存到数据库中.

 

 

产生自定义格式的自动增长序列号:



1. /**
2.  * 自己维护的序列号,至少从1开始增长
3.  */
4. public abstract class
5.       
6. public
7.       
8. public IncrementNumber(int interval, int
9. this.interval = interval;  
10. this.maxNum = maxNum;  
11.     }  
12.       
13. public synchronized int cal() throws
14. if (serialNum == -1) {  
15. // 已经使用的序列号一定 小于 缓存的序列号
16.             intervalMax = serialNum + interval;  
17.             updateStartNum(intervalMax);  
18. return
19.         }  
20. if (isMax(serialNum)) { // 达到预定的最大值
21.             resetSerialNum();  
22. return
23.         }  
24.         serialNum++;  
25. if (serialNum >= (intervalMax - 1)) { // 到达区间最大值
26.             intervalMax += interval;  
27.             updateStartNum(intervalMax);  
28.         }  
29. return
30.     }  
31.       
32. /**
33.      * 初始化序列号,从缓存系统中来,比如数据库、文件等
34.      * @return 初始序列号
35.      * @throws Exception
36.      */
37. public abstract int initStartNum() throws
38.       
39. /**
40.      * 更新区间最大值到缓存系统,比如数据库、文件中。
41.      * @param intervalMax 区间最大值
42.      * @throws Exception
43.      */
44. public abstract void updateStartNum(int intervalMax) throws
45.       
46. /**
47.      * 重置序列号,从1开始
48.      */
49. protected void resetSerialNum() throws
50. this.serialNum = 1;  
51.         intervalMax = serialNum + interval;  
52.         updateStartNum(intervalMax);  
53.     }  
54.       
55. /**
56.      * 是否是最大值
57.      * @param num
58.      * @return
59.      */
60. private boolean isMax(int
61. return
62.     }  
63.       
64. public int
65. return this.interval;  
66.     }  
67.       
68. public int
69. return this.maxNum;  
70.     }  
71.       
72. /** 区间最大值 */
73. protected int intervalMax = 0;  
74.       
75. /** 每次增加量 */
76. protected int interval = 20;  
77.       
78. /** 预定的最大值 */
79. protected int maxNum = 9999;  
80.       
81. /** 序列号 */
82. protected int serialNum = -1;  
83. }


 

使用方法:



1. @Service
2. @Transactional
3. public class TableKeyManager extends
4.       
5. public
6. super(100, 99999999);  
7.     }  
8.   
9. @Override
10. public int initStartNum() throws
11.         TableKey tableKey = tableKeyDao.getById(name);  
12. "yyMMdd"));  
13.         dateEndMillis = date.getTime();  
14.         prefix = tableKey.getDate();  
15. return (int) tableKey.getMaxNum();  
16.     }  
17.   
18. @Override
19. public void updateStartNum(int intervalMax) throws
20.         TableKey tableKey = tableKeyDao.getById(name);  
21. new Date(dateEndMillis), "yyMMdd"));  
22.         tableKey.setMaxNum(intervalMax);  
23.         tableKeyDao.update(tableKey);  
24.     }  
25.       
26. public
27. try
28. long
29. int no = 0;  
30. if
31. new
32.                 dateEndMillis = date.getTime();  
33. "yyMMdd");  
34.                 resetSerialNum();  
35. this.serialNum;  
36. else
37.                 no = cal();  
38.             }  
39. return prefix + ApplicationUtil.getFixedSizeNum(no, 8);  
40. catch
41.             e.printStackTrace();  
42.         }  
43. throw new RuntimeException("生成序列号错误");  
44.     }  
45.       
46. public void
47. this.name = name;  
48.     }  
49.       
50. private String prefix = null;  
51.       
52. private long
53.       
54. private Date date = null;  
55.       
56. private
57.       
58. @Autowired
59. private
60. }

 

这种方法仅在初始化时查询一次数据库,在每次到达增长上限时,计数自动叠加一个步长,同时更新数据库中的数据上限。

 

table_key的数据结构



1. CREATE TABLE
2. varchar(100) NOT NULL COMMENT '需要维护的key名称',  
3. '当前数据编号',  
4. timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据编号更新时间',  
5. DEFAULT NULL COMMENT '记录创建时间',  
6. PRIMARY KEY
7. ) ENGINE=InnoDB DEFAULT

在不用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表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作.

举报

相关推荐

0 条评论