• 【MySQL】实现自增函数sequence


    前言

    当前数据库为:mysql
    由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下:

    步骤

    1.创建sequence表

    CREATE TABLE `sequence` (
      `name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',
      `current_value` int(11) NOT NULL COMMENT '序列的当前值',
      `increment` int(11) NOT NULL DEFAULT '1' COMMENT '序列的自增值',
      PRIMARY KEY (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    2.创建取当前值的函数

    DROP FUNCTION IF EXISTS currval; 
    DELIMITER $ 
    CREATE FUNCTION currval (seq_name VARCHAR(50)) 
         RETURNS INTEGER
         LANGUAGE SQL 
         DETERMINISTIC 
         CONTAINS SQL 
         SQL SECURITY DEFINER 
         COMMENT ''
    BEGIN
         DECLARE value INTEGER; 
         SET value = 0; 
         SELECT current_value INTO value 
              FROM sequence
              WHERE name = seq_name; 
         RETURN value; 
    END
    $ 
    DELIMITER ; 

    3.创建取下一个值函数

    DROP FUNCTION IF EXISTS nextval; 
    DELIMITER $ 
    CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
         RETURNS INTEGER
         LANGUAGE SQL 
         DETERMINISTIC 
         CONTAINS SQL 
         SQL SECURITY DEFINER 
         COMMENT ''
    BEGIN
         UPDATE sequence
              SET current_value = current_value + increment 
              WHERE name = seq_name; 
         RETURN currval(seq_name); 
    END
    $ 
    DELIMITER ; 

    4.创建更新当前值函数

    DROP FUNCTION IF EXISTS setval; 
    DELIMITER $ 
    CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER) 
         RETURNS INTEGER 
         LANGUAGE SQL 
         DETERMINISTIC 
         CONTAINS SQL 
         SQL SECURITY DEFINER 
         COMMENT '' 
    BEGIN 
         UPDATE sequence 
              SET current_value = value 
              WHERE name = seq_name; 
         RETURN currval(seq_name); 
    END 
    $ 
    DELIMITER ; 

    数据库结构

     调用

    INSERT INTO sequence VALUES ('testSeq', 0, 1);--添加一个sequence名称和初始值,以及自增幅度
    
    SELECT SETVAL('testSeq', 10);--设置指定sequence的初始值
    
    SELECT CURRVAL('testSeq');--查询指定sequence的当前值
    
    SELECT NEXTVAL('testSeq');--查询指定sequence的下一个值
  • 相关阅读:
    Spring中bean的scope详解
    【转】Servlet生命周期
    layui切换子页面销毁定时器,切换页面失效
    工具记录 [部分摘抄 , 持续更新记录中]
    常用js对dom操作的分装[摘抄记录中....]
    常用js函数的封装集合,更新中...
    360安全浏览器的兼容显示页面
    关于浏览器弹出拦截窗口
    电脑连接小米盒子测试App记录
    面试 & 学习网址记录
  • 原文地址:https://www.cnblogs.com/jxd283465/p/11645752.html
Copyright © 2020-2023  润新知