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种方法,有需要的朋友可以参考需要 立即下载

相关推荐

专治疑难系列 - 解决打印机凭证冲突问题

一、问题描述 二、解决方法 三、问题已解决

Passerby_Wang的博客 2万+

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

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

huang714的专栏 270

基于Dify1.9知识库流水线模板的思考——图像和表格数据处理

本文探讨了Dify1.9知识库流水线中LLM节点对文档图像/表格增强处理的优化方案。针对当前仅在内容后追加说明的简单做法,提出了结构化标注的改进方法:通过唯一ID和注释块标记图像/表格及其描述,确保内容可精准对齐。文章详细阐述了该方案的解析处理流程、数据结构化表示方法,以及在RAG检索和文档还原中的具体应用。关键经验包括:必须结构化标注非文本内容、LLM增强的必要性、语义向量化处理等。该方案解决了原始方法在内容重排、相似元素区分和检索精度等方面的问题。

roseey的专栏 1438

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

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

weixin_39944233的博客 530

WSL2部署Cadence Virtuoso IC25.1:Ubuntu 26.04排障实录

WSL2以轻量虚拟机结合完整Linux内核,为Windows桌面环境提供了原生级Linux运行能力,解决了传统虚拟机资源开销大、双系统切换低效的问题。对于依赖X11图形协议、FlexNet许可服务和特定动态库的EDA工具链而言,利用WSL2部署Linux发行版需要关注系统集成、显示通路与许可连通性。从技术原理看,图形层X Server的配置、动态库依赖的补齐以及license服务的主机名解析,共同构成EDA工具在WSL2中稳定运行的关键环节。在芯片设计场景中,设计工程师常需在Windows办公机与Linux

weixin_29597551的博客 211

基于OpenClaw的AI数字员工协同团队架构设计

随着大型语言模型从被动的文本生成器向具备自主规划与执行能力的智能代理演进,企业级人工智能的应用范式正在发生根本性转变。在这一演进过程中,OpenClaw(前身为Clawdbot及Moltbot)作为一种开源的、本地优先的个人AI智能体网关基础设施,凭借其对持续内存、多通道接入以及沙盒化工具执行的原生支持,迅速成为构建“始终在线”数字劳动力的核心框架 1。然而,将单体个人助理扩展为能够处理复杂业务逻辑、支持跨组织协同并严格保障数据隔离的多智能体(Multi-Agent)团队,绝非简单的API拼接。系统架构必须

形上得其象,形下合于数;阴阳自济,玄理自明。 1048

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

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

AnnieRabbit的博客 6432

FLUENT Meshing Watertight Geometry工作流入门 - 5 生成表面网格

我们学习在生成表面网格任务下的不同输入。讨论了局部尺寸控制与全局尺寸控制的影响。最后,讨论了如何改进表面网格,以实现好的体网格质量。

B_etter_Man的博客 5635

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

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

Gblfy_Blog 1738

从零开始做对容量规划:一文讲透 SAP Greenfield sizing 与 Quick Sizer 落地方法

摘要 SAP项目早期硬件规划面临业务细节缺失的挑战,Greenfield sizing方法通过Quick Sizer工具将业务需求转化为硬件资源需求。该方法聚焦主要负载驱动因素而非精确预测,采用标准化问卷形式输入并发用户数、业务处理量等参数,输出内存、CPU等资源需求。关键步骤包括选择正确的Quick Sizer版本、创建sizing项目、参考SAP基准测试和认证目录校准结果,最终将需求交由硬件厂商落地。该方法特别适用于缺乏历史数据的新系统部署,帮助在不确定性中建立可控的容量规划模型,避免资源浪费或性能不足

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 218

基于Keil软件实现对射式红外传感器计次 (江协科技HAL库)

用HAL库复现江协科技,让嵌入式学习之路更顺畅。

2401_82728381的博客 799

MySQL实现自增序列

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

菜鸟 7936

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5088

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Mysql和Oracle实现序列自增

Mysql和Oracle实现序列自增

东哥的博客 1109

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在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、付费专栏及课程。

余额充值