美文网首页
Mysql-sequence的实现

Mysql-sequence的实现

作者: 这是一个假的程序员 | 来源:发表于2020-10-21 16:24 被阅读0次

在Oracle中,我们经常使用sequence来建立一个自增字段,在Mysql中,也有自增,但是。。(以下省略一千字。。。。用过的都知道。。。主要是我懒得写QAQ)

序列表
CREATE TABLE `sequence` (
  `seq_name` varchar(50) NOT NULL, -- 序列名称
  `current_val` int(11) NOT NULL, -- 当前值
  `increment_val` int(11) NOT NULL, -- 跨度
  PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
获取当前值的函数
CREATE FUNCTION currval (v_seq_name VARCHAR(50)) RETURNS INTEGER
BEGIN
DECLARE current INTEGER;
SET current = 0;
SELECT
    current_val INTO current
FROM
    sequence
WHERE
    seq_name = v_seq_name;
RETURN current;
END;
获取下一个值的函数
CREATE FUNCTION nextval (v_seq_name VARCHAR(50)) RETURNS INTEGER
BEGIN
DECLARE current INTEGER;
SET current = 0;
SELECT
    current_val + increment_val INTO current
FROM
    sequence
WHERE
    seq_name = v_seq_name FOR UPDATE;
UPDATE sequence
SET current_val = current
WHERE
    seq_name = v_seq_name;
RETURN current;
END;

这里使用了一个悲观锁 for update,为了防止高并发会出现重复值。

4.使用

INSERT INTO sequence (`seq_name`, `current_val`, `increment_val`) VALUES ('test', '1000', '1');

SELECT nextval('test');

得到值1001

相关文章

  • Mysql-sequence的实现

    在Oracle中,我们经常使用sequence来建立一个自增字段,在Mysql中,也有自增,但是。。(以下省略一千...

  • MD5的几种实现

    PHP的实现 Nodejs的实现 Python的实现 Golang的实现

  • 【call apply bind】源码实现

    call方法的实现 apply方法实现 bind方法实现 new方法实现 reduce实现

  • 基于动态数组的实现 Java实现 基于链表的栈的实现 Java实现

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • JS模拟实现bind,call,apply

    call apply bind 简单实现 函数柯里化的实现 构造函数的实现 ES6实现 结合实现

  • call.apply.bind实现

    call实现 apply实现 bind实现 new实现

  • Java实现最小栈的实现

    栈 实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。要保证这3个方法的时...

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • 表,栈,队列

    表的实现: ArrayList LinkedList 栈的实现: LinkedStack 队列的实现:

网友评论

      本文标题:Mysql-sequence的实现

      本文链接:https://www.haomeiwen.com/subject/zmkupktx.html