mysql实现自增序列

一种实现mysql里自增序列的方法 最近工作中遇到一个需求,需要设计一个自增字段,当每插入一条记录的时候,该字段加1,但是由于种种原因,该字段无法作为primary key存在,这样就需要该字段实现为一个自增序列。 mysql中的auto_increment可以实现自增长,其起始值是可以指定的,步长固定就是1,但是一张表里只有一个字段可以设置为auto_increment,我们的表中已经存在主键字段,其它字段就不能再指定为auto 阅读详情

在项目中用mysql作数据库。id策略用mysql的自增长。但是有些表优化后进行了分区。导致无法设置主键自增长,因此自实现了一个id生成的序列。

1.建了一张表存储表名和当前序列

2.三种实现方式

1)java同步


    public synchronized int nextInt(String tableKey) {
        SequenceExample example = new SequenceExample();
        example.createCriteria().andTableKeyEqualTo(tableKey);
        int id = 1;
        Sequence sequence = null;
        List<Sequence> list = sequenceMapper.selectByExample(example);
        if(list != null && list.size() > 0) {
            sequence = list.get(0);
            id = sequence.getCuid() + 1;
            sequence.setCuid(id);
            sequenceMapper.updateByExample(sequence, example);
        }else {
            sequence = new Sequence();
            sequence.setCuid(id);
            sequence.setTableKey(tableKey);
            sequenceMapper.insert(sequence);
        }

        return id;
    }

缺点是对所有操作都同步,效率有浪费。如果不是相同的表,那么他们的序列更新不存在竞争关系,不需要同步。

2)mysql行锁

public int nextInt(String tableKey) {
        // 获取mysql的行级锁
        sequenceMapper.getRowLock(tableKey);
        // 操作
        SequenceExample example = new SequenceExample();
        example.createCriteria().andTableKeyEqualTo(tableKey);
        int id = 1;
        Sequence sequence = null;
        List<Sequence> list = sequenceMapper.selectByExample(example);
        if(list != null && list.size() > 0) {
            sequence = list.get(0);
            id = sequence.getCuid() + 1;
            sequence.setCuid(id);
            sequenceMapper.updateByExample(sequence, example);
        }else {
            sequence = new Sequence();
            sequence.setCuid(id);
            sequence.setTableKey(tableKey);
            sequenceMapper.insert(sequence);
        }
        return id;
    }

可行,但是效率还是不够

3)mysql函数

BEGIN
DECLARE id INT DEFAULT 0;
SELECT cuid + 1 INTO id from uc_gen_number where table_key = tableKey for update;
IF id = 0 THEN 
SET id = 1;
INSERT INTO uc_gen_number (table_key, cuid) VALUES (tableKey, id);
ELSE UPDATE uc_gen_number SET cuid = id where table_key = tableKey;
END IF;
RETURN id;
END

可行,效率最好
最终选择了mysql函数的方式。

Java获取最后插入MySQL记录的自增ID值的3种方法 介绍了Java获取最后插入MySQL记录的自增ID值的3种方法,有需要的朋友可以参考需要 立即下载

相关推荐

保姆级教程:在MMSegmentation框架下复现HRNetV2+OCR语义分割(附完整代码与调试技巧)

本文提供了一份详细的MMSegmentation框架下HRNetV2+OCR语义分割的复现教程,包含完整代码与调试技巧。通过解析HRNetV2的多尺度特征融合和OCR模块的注意力计算,帮助开发者快速实现这一经典语义分割方案,并解决实际工程中的常见问题。

weixin_42527464的博客 360

架构设计 分布式业务系统中,全局ID生成策略

一、全局ID简介 在实际的开发中,几乎所有的业务场景产生的数据,都需要一个唯一ID作为核心标识,用来流程化管理。比如常见的: 订单:order-id,查订单详情,物流状态等; 支付:pay-id,支付状态,基于ID事务管理; 如何生成唯一标识,在普通场景下,一般的方法就可以解决,例如: import java.util.UUID; public class UuidUtil { public static String getUUid() { UUID uuid = UUI

huang714的专栏 270

信捷XDH PLC多轴运动控制实战:Ethercat总线下的C语言封装技巧

本文深入探讨了在信捷XDH PLC平台上,如何利用C语言对EtherCAT总线多轴运动控制进行高效封装。通过设计全局数据池、模块化状态机及用户友好接口,将底层复杂的运动控制函数库抽象为清晰、可复用的高级模块,显著提升程序稳定性与可维护性,并分享了关键的实战避坑经验。

weixin_29188043的博客 160

mysql数据库中的约束条件_《MySQL数据库》约束条件和自增长序列

原标题:《MySQL数据库》约束条件和自增长序列一、约束(constraint)约束就是在表上强制执行的一种校验规则,当执行DML操作时,数据必须符合这些规则,如果不符合,将无法执行。约束的全称:约束条件,也称之为完整性约束条件。可以保证表中数据的完整性,保证数据之间的商业逻辑。约束条件包括:1)非空约束 (not null),简称NN2)唯一性约束(unique),简称UK3)主键约束(prim...

weixin_39944233的博客 530

发那科机器人抓手与物料搬运阀的配置与优化实践

本文详细介绍了发那科机器人抓手与物料搬运阀的配置与优化实践,包括基础配置指南、阀岛与输入模块的详细设置、测试程序编写与验证技巧,以及常见问题排查与性能优化建议。通过实际案例和经验分享,帮助技术人员快速掌握关键配置步骤,提升物料搬运系统的稳定性和效率。

weixin_33738555的博客 385

codesys【modbusRTU】主站

【代码】modbusRTU【codesys】

cfqq1989的博客 4375

[MySql]函数-生成特定规则自增编号

用mysql函数实现字符串类型的自增编号

AnnieRabbit的博客 6432

CCC数字钥匙Release 3实战:如何用BLE/UWB实现无钥匙进入(附避坑指南)

本文深入解析CCC数字钥匙Release 3标准下BLE/UWB无钥匙进入系统的开发实践,涵盖硬件选型、安全测距协议、时序同步等关键环节,并提供实战调试技巧与安全攻防案例。特别针对BLE芯片配置、UWB模块选型等常见陷阱给出解决方案,帮助开发者高效实现厘米级精度的数字钥匙系统。

weixin_29326909的博客 256

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

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

Gblfy_Blog 1738

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4345

【XSRP软件无线电】基于软件无线电平台的QPSK频带通信系统设计(含有完整工程资料获取链接)

软件无线电(Software Defined Radio, SDR)是一种无线通信系统,它通过软件来定义和实现无线电的功能,而不是依赖于传统的硬件电路。SDR平台的核心思想是将传统无线电系统中的大部分硬件功能,如调制解调、信号处理、频率选择等,通过软件来实现。这种设计理念使得SDR具有高度的灵活性和可重配置性,能够适应不同的通信标准和频段,快速适应新的通信技术。

嵌入式技术开发 3283

MySQL实现自增序列

MySQL实现序列效果 转载 新建序列表 drop table if exists sequence; create table sequence ( seq_name VARCHAR(50) NOT NULL, -- 序列名称 current_val INT NOT NULL, -- 当前值 increment_v...

菜鸟 7936

笔试题-2023-芯动-数字IC设计【纯净题目版】

笔试题-2023-芯动-数字IC设计【纯净题目版】

w0shishabi的博客 6397

mysql实现自增序列的脚本

脚本内容如下: DROP TABLE IF EXISTS sequence; CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 1, PRIMARY KEY (name) ) ENGINE=InnoDB; DROP FUNCTIO...

qq_40097074的博客 710

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Mysql和Oracle实现序列自增

Mysql和Oracle实现序列自增

东哥的博客 1109

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql 自增序列_mysql实现自增序列的示例代码

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 '序...

weixin_39923262的博客 369

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

在MySQL中创建实现自增的序列(Sequence)

在MySQL中创建实现自增的序列(Sequence) 问题 MySQL中在表的定义中可以对字段名设置为 AUTO_INCREMENT (自动递增),但这有时并不能满足我们的需求,例如,我们在应用中使用JDBC向数据库中添加数据时,我们同时需要将自增的主键作为一个外键去更新其他的关联表,然而我们此时并不能获取这个自增的主键。 所以想到了利用一个独立的自增的sequence来解决该问题。 ...

远方水木 3349

MYSQL实现序列自增

MYSQL实现Sequence   由于项目需求,需要实现Sequence效果,MYSQL中是不支持Sequence,只支持主键自增Increment,但也只是自增,而不能设置步长、开始索引、是否循环等,最重要的是一张表只能由一个字段使用自增,但有的时候我们需要两个或两个以上的字段实现自增(单表多字段自增),MYSQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值 数据库...

iKun 1万+

mysql实现序列自增_mysql实现自增序列的示例代码

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 '序...

weixin_39624071的博客 210

mysql递增统计数量,mysql实现自增序列,教你如何实现线程安全的mysql自增统计

oracle是有自增序列的机制的,而mysql并没有。那么mysql想要实现字段的自增从而统计数量,或者实现一个自增序列需要怎么做呢?1.创建序列表。

秃了也弱了 2958

mysql 实现自增序列

参考此博客 1、创建表tb_sequence,用来存放sequence值: create table tb_sequence(name varchar(50) not null,current_value int not null,_increment int not null default 1, primary key(name)); 2、手动插入数据: insert into tb_sequence values('userid',100,2); 3、定义函数 _nextval:

RT_0114的博客 466

mysql 实现id自增序列_MySQL自增序列的妙用

MySQL自增序列的妙用MySQL字增序列的基本知识:自增字段的数据类型必须为:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT中的一种,并且必须作为主键或联合主键的一部分。若是作为主键的一部分,自增序列字段值将会丧失唯一性保证。自增序列,对INSERT语句敏感,读UPDATE,DELETE语句是不敏感的。演示示例:root@localhost : test 02:36:...

weixin_39955781的博客 951

mysql 实现id自增序列_在MySQL中创建实现自增的序列(Sequence)的教程

项目应用中,曾有以下一个场景:接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。所以想到了利用一个独立的自增的sequence来解决该问题。当前数据库为:mysql由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下:第一步:创建--Sequence 管理...

weixin_39800971的博客 951

mysql 自增张英文_mysql实现自增序列的示例代码

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 '序...

weixin_34409895的博客 447

MySQL实现自增的序列(Sequence)

1、Mysql不支持直接的Sequence,首先需要创建一张表来模拟Sequence的功能。 CREATE TABLE t_sequence( seq_name varchar(100) NOT NULL COMMENT '主键', table_name varchar(100) NOT NULL COMMENT '表名标识该序列是某张表的', column_name varchar(200) N...

龙吟山庄 2314

mysql实现自定义sequence自增序列

mysql数据库没有oracle数据库中sequence序列,mysql中只有auto_increment自增,这种自增方式只能是整数类型的,如果要自定义的自增序列,mysql就不能实现。 这里,提供mysql实现自定义sequence自增序列的一种方法。 (1)创建一个自增序列表 DROP TABLE IF EXISTS sequence; -- 创建序列表 CREATE TABLE IF NOT EXISTS sequence ( sequence_name VARCHAR(50) PRIMA

✅ Java 开发工程师 1495
上一篇: mysql日期存储为int,mybatis做ORM映射与java.util.Date的转换问题
下一篇: win7下安装mongodb
y_wave
博客等级 码龄16年 1粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值