数据库的序列

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>

表 中列出的这些序列函数,可以为我们从序列对象中获取连续的序列值提供了简单的、多用户安全的 方法。

image.png
上一篇下一篇

猜你喜欢

热点阅读