数据库的序列
2021-04-14 本文已影响0人
TheRaging
场景需求
需要向下图一样,需要对产品编码编码设置一个序列。编码规则 SKU + 序列号:
image.png序列
序列是基于bigint算法的,因此范围是不能超过一个八字节 整数的范围(-9223372036854775808 到 9223372036854775807)。
由于nextval和setval调用绝不会回滚, 如果需要序数的"无间隙"分配,则不能使用序列对象。可以 通过在一个只包含一个计数器的表上使用排他锁来构建无间隙的分配, 但是这种方案比序列对象开销更大,特别是当有很多事务并发请求序数时
创建和使用语法:
CREATE SEQUENCE serial START 101;
SELECT nextval('serial');
nextval
---------
101
CREATE SEQUENCE 序列名
INCREMENT BY 进度值
START WITH 初始值
MAXvalue 最大值
MINVALUE 最小值
CYCLE 循环(NOCYCLE 不循环)
CACHE 缓存个数 (NOCACHE 不设置缓存)
删除序列
drop sequence SEQ_AI_ZQZT_ZZZ_TEST;
结合mybatis使用序列,在insert的时候自动新增
<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>