基于MySQL数据库实现序列自增功能

发表于:2019-12-10 10:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:波波说运维    来源:今日头条

#
MySQL
分享:
  概述
  由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能。
  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 ;
  
  
  5、测试
   INSERT INTO sequence VALUES ('hwb_Seq', 0, 1);--添加一个sequence名称和初始值,以及自增幅度
  SELECT SETVAL('hwb_Seq', 10);--设置指定sequence的初始值
  SELECT CURRVAL('hwb_Seq');--查询指定sequence的当前值
  SELECT NEXTVAL('hwb_Seq');--查询指定sequence的下一个值

  这里,hwb_Seq可以认为是一个表名,通过insert语句插入指定表的第一个序列,然后使用NEXTVAL方法,不断更新这一列数据,来获取下一个序列的值。可以通过这张表,来实现N张表的自增序列的统一管理。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号