• 【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的下一个值
  • 相关阅读:
    Android 浅谈相机研发
    Android线程和线程池
    android之多媒体篇(三)
    android之多媒体篇(二)
    android之多媒体篇(一)
    Android图片缩放方法
    android之BitmapFactory.Options的使用
    mac .bash_profile环境变量汇总
    免费的HTML5连载来了《HTML5网页开发实例具体解释》连载(六)媒体查询
    LeetCode
  • 原文地址:https://www.cnblogs.com/jxd283465/p/11645752.html
Copyright © 2020-2023  润新知