mysql自定义sequence_单机版 mysql 序列 sequence 生成策略

本文探讨了如何通过调整序列号步长和使用多序列表来减少数据库访问频率,分享了创建序列表、自增ID管理和函数式更新的方法。重点介绍了在`SEQ_DEMO`表中利用`last_insert_id()`和批量操作,以及将多个序列合并到`REB_SEQ`表中的最佳实践。
摘要由CSDN通过智能技术生成

1. 一个序列对应一张表

每次从数据库取的序列号大小记为n 也可以理解为步长 适当增大可以防止频繁访问数据库

因为mysql的AUTO_INCREMENT步长是全局的,所以,不建议更改步长

CREATE TABLE `SEQ_DEMO` (

`id` bigint(10) unsigned NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT SEQ_DEMO VALUES(0)

@Test

public void test() throws Exception {

int n = 1;

Connection con = dataSourceWrite.getConnection();

con.setAutoCommit(false);

String sql = "update SEQ_DEMO set id = last_insert_id(id + n) ";

Statement stmt = con.createStatement();

stmt.executeUpdate(sql);

String nextSql = "select last_insert_id()";

ResultSet rs = stmt.executeQuery(nextSql);

while (rs.next()) {

Long id = rs.getLong(1);

System.err.println("now id=" + id);

}

con.commit();

con.close();

}

2.多个序列放在一张表上

1. 建表

-- 也可以在表里面加上步长这个列 然后在函数只传一个参数即可 原理是一样的

CREATE TABLE `REB_SEQ`

`seq_name` varchar(50) NOT NULL COMMENT '序列名',

`curr_value` bigint(20) DEFAULT '0' COMMENT '当前值',

-- `increment` int(10) DEFAULT '1' COMMENT '步长 默认1',

PRIMARY KEY (`seq_name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.建函数

-- 如果increment在表里面设置 则不需要参数 param_cache_size

DROP FUNCTION IF EXISTS `fun_next_seq`$$

CREATE DEFINER=`root`@`%` FUNCTION `fun_next_seq`(param_seq_name VARCHAR(50),param_cache_size INT(10)) RETURNS INT(11)

DETERMINISTIC

BEGIN

DECLARE ret BIGINT(20);

UPDATE REB_SEQ SET curr_value = curr_value + param_cache_size WHERE seq_name = param_seq_name;

SET ret = 0;

SELECT curr_value INTO ret FROM REB_SEQ WHERE seq_name = param_seq_name;

RETURN ret;

END$$

DELIMITER ;

3. 执行sql

int n = 1;

String seqName = "your seq name";

String sql = "SELECT fun_next_seq(seqName, n)";

...

long id = jdbc.execute(sql)

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值