** 背景 **
項目中訂單號原來的生成規則由日期加隨機數組成,后期需求決定將訂單號生成規則更改為生成日期加當天當前訂單數。
每天的訂單數都是從0開始的,每生成一個訂單,訂單數就應該加1.訂單數應該是持久的,寫在Session中或者Memcached緩存中,當網站重啟或者服務器重啟時都會面臨丟失的問題,所以只能存在數據庫中。幸好Oracle數據庫提供了Sequence(序列)功能,我們來看下Sequence(序列)的概述及其用法。
** 概述 **
Oracle提供了Sequence對象,由系統提供自增長的序列號,通常用于生成數據庫的自增長主鍵或序號的地方。
Sequence是數據庫系統按照一定規則自動增加的數字序列。這個序列一般作為代理主鍵(因為不會重復),沒有其他任何意義。1
** 基本用法 **
CREATE SEQUENCE emp_sequence -序列名
INCREMENT BY 1 — 每次遞增數值
START WITH 1 — 從1開始計數
MAXVALUE 999999 --最大值 || NOMAXVALUE — 不設置最大值
CYCLE - 循環,達到最大值從最小值開始||NOCYCLE — 一直累加,不循環
CACHE 10;-緩存數值
下面我們就來看EF的DbContext具體使用:
** 1. 判斷是否存在名為ODORDER
的序列 **
int count = context.Database.SqlQuery<int>("SELECT count(*) FROM All_Sequences where Sequence_name='ODORDER'").FirstOrDefault()
如數據庫中存在該序列,則返回的數值應大于0。
** 2. 每天的訂單數都應該是從新開始的,所以簡單做法如果存在ODORDER
該序列,我們先刪除. **
context.Database.ExecuteSqlCommand("DROP SEQUENCE ODORDER")
** 3. 創建名為ODORDER
的序列 **
context.Database.ExecuteSqlCommand("CREATE SEQUENCE ODORDER INCREMENT BY 1 START WITH 100000 MAXVALUE 900000 MINVALUE 100000 CYCLE CACHE 20 ");
** 4. 獲取最新訂單數 **
context.Database.SqlQuery<int>("select ODORDER.nextval from dual").FirstOrDefault()
原創文章,如有轉摘請注明來源!