場景需求
需要向下圖一樣,需要對產(chǎn)品編碼編碼設(shè)置一個(gè)序列。編碼規(guī)則 SKU + 序列號:

image.png
序列
序列是基于bigint算法的,因此范圍是不能超過一個(gè)八字節(jié) 整數(shù)的范圍(-9223372036854775808 到 9223372036854775807)。
由于nextval和setval調(diào)用絕不會(huì)回滾, 如果需要序數(shù)的"無間隙"分配,則不能使用序列對象??梢?通過在一個(gè)只包含一個(gè)計(jì)數(shù)器的表上使用排他鎖來構(gòu)建無間隙的分配, 但是這種方案比序列對象開銷更大,特別是當(dāng)有很多事務(wù)并發(fā)請求序數(shù)時(shí)
創(chuàng)建和使用語法:
CREATE SEQUENCE serial START 101;
SELECT nextval('serial');
nextval
---------
101
CREATE SEQUENCE 序列名
INCREMENT BY 進(jìn)度值
START WITH 初始值
MAXvalue 最大值
MINVALUE 最小值
CYCLE 循環(huán)(NOCYCLE 不循環(huán))
CACHE 緩存?zhèn)€數(shù) (NOCACHE 不設(shè)置緩存)
刪除序列
drop sequence SEQ_AI_ZQZT_ZZZ_TEST;
結(jié)合mybatis使用序列,在insert的時(shí)候自動(dòng)新增
<insert id="addUser">
<selectKey keyProperty="userId" resultType="java.lang.String" order="BEFORE">
SELECT SEQ_AI_ZQZT_ROLE_ZT_USER.NEXTVAL FROM dual
</selectKey>
INSERT INTO AI_ZQZT_ROLE_ZT_USER
(
USER_ID,
CITY_CODE,
COUNTY_CODE,
USER_NAME,
MOBILE_PHONE,
USER_CODE,
IS_ZT_MONITOR,
DATA_STATUS,
CITY_NAME,
COUNTY_NAME
)
VALUES
(
#{userId,jdbcType=VARCHAR},
#{cityCode,jdbcType=VARCHAR},
#{countyCode,jdbcType=VARCHAR},
#{userName,jdbcType=VARCHAR},
#{mobilePhone,jdbcType=VARCHAR},
#{userCode,jdbcType=VARCHAR},
#{isZtMonitor,jdbcType=VARCHAR},
'1',
#{cityName,jdbcType=VARCHAR},
#{countyName,jdbcType=VARCHAR}
)
</insert>
表 中列出的這些序列函數(shù),可以為我們從序列對象中獲取連續(xù)的序列值提供了簡單的、多用戶安全的 方法。

image.png