go写mysql取得自增字段值

场景:有多张表,依据其中一张表的自增字段取得 id 值作为对象ID,然后使用这个Id插入到其他它表中。

如下一张 MySQL 的 innodb 表 X,用 go 编写程序,不指定 a 的值,指定 b 和 c 的值,往表 X 插入数据,如果数据已经存在则执行更新操作,成功后取得该笔插入或者更新的记录对应的 a 字段的值。

create table X (a int unsigned AUTO_INCREMENT, b int, c int,PRIMARY KEY (a), UNIQUE KEY(b) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

非事务版本:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)func main() {db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")if err != nil {panic(err)}defer db.Close()// 插入或更新记录query := `INSERT INTO X (b, c) VALUES (?, ?)ON DUPLICATE KEY UPDATE c = VALUES(c), a = LAST_INSERT_ID(a)`result, err := db.Exec(query, "value1", "value2")if err != nil {panic(err)}// 获取自增IDlastInsertID, err := result.LastInsertId()if err != nil {panic(err)}fmt.Printf("LastInsertID: %d\n", lastInsertID)
}

非事务版本不能保持 a 值的连续性。

事务版本:

package mainimport ("database/sql""fmt""sync"_ "github.com/go-sql-driver/mysql"
)func upsertRecord(db *sql.DB, b, c int) (int, error) {// 开始事务tx, err := db.Begin()if err != nil {return 0, err}defer tx.Rollback()// 尝试查找记录var id interr = tx.QueryRow("SELECT a FROM X WHERE b = ?", b).Scan(&id)if err != nil {if err == sql.ErrNoRows {// 记录不存在,插入新的记录result, err := tx.Exec("INSERT INTO X (b, c) VALUES (?, ?)", b, c)if err != nil {return 0, err}lastInsertID, err := result.LastInsertId()if err != nil {return 0, err}id = int(lastInsertID)} else {// 其他错误return 0, err}} else {// 记录存在,更新记录_, err = tx.Exec("UPDATE X SET c = ? WHERE a = ?", c, id)if err != nil {return 0, err}}// 提交事务err = tx.Commit()if err != nil {return 0, err}return id, nil
}func main() {db, err := sql.Open("mysql", "dswrite:ds#582701@tcp(9.134.177.242:3306)/dsdb")if err != nil {panic(err)}defer db.Close()var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()id, err := upsertRecord(db, 20+i, 100+i)if err != nil {fmt.Printf("Error: %v\n", err)} else {fmt.Printf("ID: %d\n", id)}}(i)}wg.Wait()
}

该版本可以保持 a 值的连续性。实际可以再优化,去掉 select,先 insert 或者 update 即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里后台开发面经分析:如何才能更好地回答问题?

这一篇文章是来自群友分享阿里面试过程&#xff0c;我想通过这种情景模拟地方式来告诉大家在面试地时候&#xff0c;应该如何有条理地回答问题。 面试官: 能否解释一下简单工厂模式存在的问题&#xff0c;为何会违背开放-封闭原则&#xff1f; 求职者: 嗯&#xff0c;简单工厂…

第4章 HSA运行时

HSA运行时是一种精简的用户模式应用程序编程接口API&#xff0c;它提供了主机将计算内核启动到可用HSA代理程序所必须的接口。它可以分为两类&#xff1a;核心和扩展。HSA核心运行时API旨在支持HSA系统平台体系结构规范所需的操作&#xff0c;并且必须得到任何符合HSA的系统的支…

transformers命名体识别

命名体识别(Named Entity Recognition,简称NER)是自然语言处理(Natural Language Processing, NLP)领域中的一项关键技术,其主要任务是从非结构化的文本数据中自动识别并抽取具有特定意义的实体信息。这些实体通常是指人名、地名、组织机构名、日期时间、货币金额、百分比…

Java多线程导入Excel示例

在导入Excel的时候&#xff0c;如果文件比较大&#xff0c;行数很多&#xff0c;一行行读往往速度比较慢&#xff0c;为了加快导入速度&#xff0c;我们可以采用多线程的方式 话不多说直接上代码 首先是Controller import com.sakura.base.service.ExcelService; import com.s…

智慧城市中的数字孪生:数字孪生技术助力智慧城市提高公共服务水平

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、智慧交通管理 2、智慧能源管理 3、智慧环保管理 4、智慧公共安全 四、数字孪生技术助力智慧城市提高公共服务水平的价值 五、挑战与前景 六、结论 一、引言 随着信息技术的飞速发展&…

【LeetCode】升级打怪之路 Day 13:优先级队列的应用

今日题目&#xff1a; 23. 合并 K 个升序链表 | LeetCode378. 有序矩阵中第 K 小的元素 | LeetCode373. 查找和最小的 K 对数字 | LeetCode703. 数据流中的第 K 大元素 | LeetCode347. 前 K 个高频元素 | LeetCode 目录 Problem 1&#xff1a;合并多个有序链表 【classic】LC 2…

【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议

1. AVDTP概念 AVDTP即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协议),主要负责 A/V stream的协商、建立及传输程序,还指定了设备之前传输A/V stream的消息格式. AVDTP的传输机制和消息格式是以 RTP为基础的。RTP由 RTP Data Transfer Protocol (RTP)和…

【国产MCU】-CH32V307-实时时钟(RTC)

实时时钟(RTC) 文章目录 实时时钟(RTC)1、实时时钟(RTC)介绍2、RTC驱动API介绍3、RTC使用实例RTC 实时时钟是一组32 位可编程计数器,时基支持20 位预分频,用于较长时间段的测量。时钟基准来源高速的外部时钟128分频(HSE/128)、外部晶体低频振荡器(LSE)或内部低功耗RC…

【软考高项】【计算专题】- 5 - 进度类 - 横道图/甘特图

一、知识点 1、基本定义 甘特图(Gantt chart )又称为横道图、条状图(Bar chart)&#xff0c;通过条状图来显示项目各活动的进 度情况。以提出者亨利劳伦斯甘特( Henry Laurence Gantt)先生的名字命名。 目前许多文档工具都可以画甘特图。 &#xff08;1&#xff09;我的举例 …

NodeJS 21 的新功能

从使 fetch 和 WebStreams 稳定化到引入实验性的 WebSocket 客户端&#xff0c;Node.js 21 正在为服务器端 JavaScript 执行设定新的标准。 V8 11.8 的更新不仅提升了性能&#xff0c;还添加了开发者一直期待的新语言功能。 让我们来看看所有 Node.js 21 的功能&#xff01; …

07. Nginx进阶-Nginx负载均衡

简介 负载均衡 什么是负载均衡&#xff1f; 负载均衡&#xff0c;英文名称为Load Balance&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行。 Nginx负载均衡 什么是Nginx负载均衡&#xff1f; Nginx负载均衡可以大…

【Oracle不停库迁移, 迁移完成无法启动】

MD[Oracle不停库迁移, 迁移完成无法启动] Oracle不停库迁移, 迁移完成无法启动 说明: 1. 在企业上云的大背景下, 自建数据库迁移到云服务器内, 场景较为常见。本文意在解决Oracle迁移到云服务器内&#xff0c;无法启动的问题。 2. 用云厂商的迁移服务(如, 华为云SMS)&#xf…

计算机网络-典型网络组网架构

前面基本网络知识已经能够满足中小企业的需要了&#xff0c;今天来看下一些基本网络组网架构。 首先网络是分层架构&#xff0c;从接入层到汇聚层再到核心层&#xff0c;然后接入运营商出口。内部包括有线网络、无线网络&#xff0c;出口一般可以使用路由器或者防火墙进行安全防…

StarRocks实战——vivo基于 StarRocks 构建实时大数据平台

目录 前言 一、数据挑战 1.1 时效性挑战&#xff0c;业务分析决策需加速 1.2 访问量挑战&#xff0c;性能与稳定性亟待提高&#xff0c;支撑业务稳定运行 1.3 计算场景挑战&#xff0c;难以满足业务复杂查询需求 1.4. 运维挑战&#xff0c;用户查询体验需优化 二、OLA…

WebDAV之π-Disk派盘+人生Life

人生Life是一款日程软件,在这款待办的日程软件当中各种功能极为的完善,完全的足够用户在日常当中的使用,你的待办方面的各种内容都能够在软件上面进行规划和填充,通过待办事项来帮助用户提高在日常当中的效率,对于用户来说这款待办事项的软件是绝佳的选择。 π-Disk派盘 …

java面试(jvm)

JVM内存模型 细分Eden&#xff1a; java类加载过程&#xff1f;双亲委派机制&#xff1f;一个对象从加载到JVM&#xff0c;再到被GC清除过程&#xff1f; JAVA类加载器&#xff1a;AppClassLoader - ExtClassLoader - BootStrapClassLoader。每种类加载器都有他自己的加载目录…

浅谈网络爬虫与Web安全

网络爬虫(Web Crawler)&#xff0c;又称网络蜘蛛(Web Spider)或网络机器人(Web Robot)&#xff0c;是一种按照一定的规则自动抓取万维网资源的程序或者脚本&#xff0c;已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源&#xff0c…

2024年聚合工艺证模拟考试题库及聚合工艺理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年聚合工艺证模拟考试题库及聚合工艺理论考试试题是由安全生产模拟考试一点通提供&#xff0c;聚合工艺证模拟考试题库是根据聚合工艺最新版教材&#xff0c;聚合工艺大纲整理而成&#xff08;含2024年聚合工艺证…

ANSYS穿孔板随机微孔隙构建及力学模拟

多孔结构板在减轻结构重量、满足吸声功能等环境下应用广泛&#xff0c;本案例采用ANSYS Workbench对曲线边界孔洞的随机多孔板进行轴心受拉力学分析。 随机微穿孔板可采用CAD Voronoi插件构建&#xff0c;三维模型构建如下。 CAD Voronoi插件采用参数化建模方式&#xff0c;根…

Mysql去除重复项:力扣182. 查找重复的电子邮箱

题目链接&#xff1a;182. 查找重复的电子邮箱 - 力扣&#xff08;LeetCode&#xff09; 题目描述 sql语句 方法1&#xff1a;使用临时表 select Email from (select Email, count(Email) as numfrom Persongroup by Email ) as statistic where num > 1 ;方法2&#xff…