Advertisement

在Mysql中, 实现在某一张表中某一字段增加自增序列值(sequence 自增序列)

阅读量:

由于mysql和oracle不太一样

首先,请您建立一个名为--Sequence--的管理表(建议将流水号字段定义为long类型,并根据具体场景选择是否采用bigint或其他数据类型)

current_value:指初始值; increment:指自增幅度;

复制代码
 DROP TABLE IF EXISTS sequence;

    
 CREATE TABLE sequence (
    
      name VARCHAR(50) NOT NULL,
    
      current_value bigint NOT NULL,
    
      increment bigint NOT NULL DEFAULT 1,
    
      PRIMARY KEY (name)
    
 ) ENGINE=InnoDB;

-- 第二步:创建--取当前值的函数

复制代码
 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 ;

-- 第三步:创建--取下一个值的函数

复制代码
 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 ;

-- 第四步:创建--更新当前值的函数

复制代码
 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);    //别名  初始值  自增方式
复制代码
 SELECT SETVAL('TestSeq', 1000000000);   -- 设置指定TestSeq 的sequence的初始值

    
 SELECT CURRVAL('TestSeq');      -- 查询指定TestSeq 的sequence的当前值
    
 SELECT NEXTVAL('TestSeq');      -- 查询指定TestSeq 的sequence的下一个值

搞定!

在Java编程过程中,可以直接生成SQL语句来获取下一个编号,并有效避免了流水号重复的风险。

献给自己。自我加深印象。

全部评论 (0)

还没有任何评论哟~