ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL 新增序列三步曲

2021-12-29 18:02:14  阅读:168  来源: 互联网

标签:comment val seq sequences VALUE MySQL 序列 null 三步


 

1、创建一个统一管理序列的表sequences

drop table if exists sequences;
create table sequences
(
  SEQUENCE_NAME varchar(80)  not null comment '自增序列名称'
    primary key,
  INCREMENT_BY  int          not null comment '步长',
  CURRENT_VALUE bigint       not null comment '当前值',
  MIN_VALUE     bigint       null comment '最小值',
  MAX_VALUE     bigint       null comment '最大值',
  COMMENTS      varchar(200) null comment '序列描述',
  CYCLE         varchar(10)  null comment '当值为CYCLE时,代表循环'
);

2、创建一个自增序列函数

drop function if exists nextval;
create function nextval(a_seq_name varchar(55))
  returns bigint
  BEGIN
    DECLARE seq_val BIGINT;
    DECLARE min_val BIGINT;
    DECLARE max_val BIGINT;
    DECLARE cycle_val VARCHAR(10);
    SET seq_val = -1;
    IF EXISTS(SELECT 1
              FROM sequences holdlock
              WHERE SEQUENCE_NAME = a_seq_name)
    THEN
      SELECT
        CURRENT_VALUE + INCREMENT_BY,
        MIN_VALUE,
        MAX_VALUE,
        CYCLE
      INTO seq_val, min_val, max_val, cycle_val
      FROM sequences
      WHERE SEQUENCE_NAME = a_seq_name FOR UPDATE;
      IF seq_val > max_val
      THEN
        IF cycle_val = 'CYCLE'
        THEN
          SET seq_val = min_val;
        ELSE
          SIGNAL SQLSTATE '42000'
          SET MESSAGE_TEXT ='error:1000,sequence beyond the max value ';
        END IF;
      END IF;
      UPDATE sequences
      SET CURRENT_VALUE = seq_val
      WHERE SEQUENCE_NAME = a_seq_name;
    ELSE
      SIGNAL SQLSTATE '42000'
      SET MESSAGE_TEXT ='error:1001,Query was empty,sequence name not found ';
    END IF;
    RETURN seq_val;
  END;

3、插入数据

insert into sequences(sequence_name, increment_by, current_value, min_value, max_value, comments, cycle)
value ('PHONE_NBR_SEQ', 1, 20221001, 20221001, 9999999999, '手机号码序列', null);

4、查询序列

select nextval('PHONE_NBR_SEQ')
from dual; //可省略

标签:comment,val,seq,sequences,VALUE,MySQL,序列,null,三步
来源: https://www.cnblogs.com/passex/p/15745993.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有