zoukankan      html  css  js  c++  java
  • 【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的下一个值
  • 相关阅读:
    使用清华源进行pip install
    BERT和ULMFIT embedding比较文本分类结果
    Ubuntu16.04更新python3.5到python3.7
    base64方式显示控件
    在使用redis做缓存后,mybatis的延迟加载失效
    springboot:redis反序列化发生类型转换错误
    eclipse :代码自动补全不生效解决办法
    微信扫码支付:问题集锦
    微信扫码支付(4):统一下单
    微信扫码支付(3):获取验签秘钥
  • 原文地址:https://www.cnblogs.com/jxd283465/p/11645752.html
Copyright © 2011-2022 走看看