在平常开发系统,设计表结构的时候,常常需要有一个字段来标识该条记录的唯一性,从java层面和数据库层面不同维度来进行实现
java生成唯一标识
版本一
java
自带生成唯一标识UUID
System.out.println(UUID.randomUUID().toString());
输出
4880d2b4-bc5f-48d1-ba58-003334276d46
明显地看出来太长了而且很不友好
版本二
进一步处理生成8位UUID
public String[] chars = new String[]
{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
};
public String getShortUuid() {
StringBuffer stringBuffer = new StringBuffer();
String uuid = UUID.randomUUID().toString().replace("-", "");
for (int i = 0; i < 8; i++) {
String str = uuid.substring(i * 4, i * 4 + 4);
int strInteger = Integer.parseInt(str, 16);
stringBuffer.append(chars[strInteger % 0x3E]);
}
return stringBuffer.toString();
}
@Test
public void test4(){
TestDemo2 testDemo2 = new TestDemo2();
System.out.println(UUID.randomUUID().toString());
System.out.println(testDemo2.getShortUuid());
}
输出
4880d2b4-bc5f-48d1-ba58-003334276d46
M3EeoAYr
版本三
时间戳加上生成的8位UUID
@Test
public void test3() {
TestDemo2 testDemo2 = new TestDemo2();
String shortUuid = testDemo2.getShortUuid();
String create_time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
System.out.println(create_time+shortUuid);
}
输出
20190925101216hh42xxn6
推荐使用时间戳加上生成的8位UUID
oracle生成唯一标识
版本一
序列号生成唯一标识
创建序列
-- Create sequence
create sequence SEQ_ORDER_ID
minvalue 100000
maxvalue 999999
start with 414591
increment by 1
nocache
cycle;
字段 | 说明 |
---|---|
minvalue |
定义序列生成器能产生的最小值 |
maxvalue |
定义序列生成器能产生的最大值 |
start with |
定义序列的初始值(即产生的第一个值),默认为1 |
increment by |
定义序列的步长(增长量),如果省略,则默认为1 ,如果出现负值,则代表序列的值是按照此步长递减的 |
nocache |
表示不对序列进行内存缓冲 |
cycle |
表示当序列生成器的值达到限制值后是否循环。CYCLE 代表循环,NOCYCLE 代表不循环 |
获取序列号
SELECT SEQ_ORDER_ID.NEXTVAL FROM DUAL;
输出
414785
版本二
时间戳加上序列号
SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')||SEQ_ORDER_ID.NEXTVAL FROM DUAL;
输出
20190925102115414805
推荐使用时间戳加上序列号