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