流水號的生成 日期 業務碼 自增序列

2021-07-03 13:10:17 字數 2181 閱讀 5737

專案開發時,使用了兩套資料庫,開發環境和上線環境,資料庫表中大多採用了自增主鍵,

比如:

id

intunsigned primary key auto_increment,

但往往會碰到一些問題,比如:

開發環境中,使用爬蟲抓取一些資料,建立索引,再把資料遷移到上線環境,會導致索引中的id和

上線環境資料庫中id對不上,所以決定使用字串作為主鍵。

那麼問題來了,如何生成唯一的序列號?

格式按照:yyyymmdd+兩位業務碼+10位的自增序列,

比如20150101**99**0000000001。

思路:

獲得日期很簡單;

業務碼是呼叫服務傳入的引數;

使用redis來實現10位的自增序列的儲存和自增,使用serial.number:的格式來儲存某一天的自增序列的值;

主要**如下:

public

inte***ce

serialnumberservice

* *@param bizcode

* 兩位,00-99

*@return 20位的序列號

*@throws serviceexception

*/string generate(string bizcode) throws serviceexception;

//其實,應該對bizcode做白名單驗證,以免惡意偽造

default

boolean islegal(string bizcode)

if (character.isdigit(bizcode.charat(0))

&& character.isdigit(bizcode.charat(1)))

return

true;

return

false;

}}@service

public

class

serialnumberserviceimpl

implements

serialnumberservice

/** 獲取今天的日期:yyyymmdd */

string date = timeutil.gettoday();

/** 構造redis的key */

string key = serial_number + date;

/** 自增 */

long sequence = redisdao.incr(key);

string seq = stringutil.getsequence(sequence);

stringbuilder sb = new stringbuilder();

string serial = sb.tostring();

return serial;

}}public

class

timeutil

/*** 獲取今日日期

* *@return

*/public

static string gettoday()

}public

class

stringutil

static

final

int default_length = 10;

/*** 得到10位的序列號,長度不足10位,前面補0

* *@param seq

*@return

*/public

static string getsequence(long seq)

int rest = default_length - len;

stringbuilder sb = new stringbuilder();

for (int i = 0; i < rest; i++)

return sb.tostring();

}}

只宣告了redisdao介面,可以使用jedis客戶端來實現。

public

inte***ce

redisdao

這樣redis裡面就儲存了每天產生的最大序列號,

可以根據日期、業務碼等統計相關資訊。

個人部落格: bingtel-木猶如此的部落格, 有興趣可以關注下

SQL生成 日期 流水號 的編號

以下 生成的編號長度為12,前6位為日期資訊,格式為yymmdd,後6位為流水號。建立得到當前日期的檢視 create view v getdate asselect dt convert char 6 getdate 12 go 得到新編號的函式 create function f nextbh ...

根據日期 順序號生成流水號的儲存過程

前幾天做乙個專案,要求能按日期 順序號生成流水號,檢視網上相關方法發現都差不多,但是沒有完整的編碼,被逼無賴,自己做乙個,頂一頂也用起來了.本儲存過程在sql server 2000下測試通過 create procedure dbo createpcdid pcdid char 20 output...

mysql 觸發器生成字母 日期 流水號的編號

最近自己做了乙個專案 裡面有個字段是 編號自動生成 規則 jj 日期 3位流水號 實現方法 delimiter create definer trigger tg 表名 before insert on 表名 for each row begin declare n int select ifnul...