mysql视图自增id_7种获取MySQL插入数据的自增ID方法,你知道他们的优劣吗?-程序员宅基地

技术标签: mysql视图自增id  

mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢?

方法一:是使用last_insert_id

mysql> SELECT LAST_INSERT_ID();

产生的ID 每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的 AUTO_INCREMENT值。这个行为保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁或处理。

每次mysql_query操作在mysql服务器上可以理解为一次“原子”操作, 写操作常常需要锁表的, 是mysql应用服务器锁表不是我们的应用程序锁表。

值得注意的是,如你一次插入了多条记录,这个函数返回的是第一个记录的ID值。

因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数 将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录, LAST_INSERT_ID返回一个列表。

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

方法二:是使用max(id)

使用last_insert_id是基础连接的,如果换一个窗口的时候调用则会一直返回10

如果不是频繁的插入我们也可以使用这种方法来获取返回的id值

select max(id) from user;

这个方法的缺点是不适合高并发。如果同时插入的时候返回的值可能不准确。

方法三:是创建一个存储过程,在存储过程中调用先插入再获取最大值的操作

DELIMITER $$DROP PROCEDURE IF EXISTS `test` $$CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(in name varchar(100),out oid int)BEGIN  insert into user(loginname) values(name);  select max(id) from user into oid;  select oid;END $$DELIMITER ;call test('gg',@id);

方法四:使用@@identity

select @@IDENTITY

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定 义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据 后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

方法五:是使用getGeneratedKeys()

Connection conn = ;Serializable ret = null;PreparedStatement state = .;ResultSet rs=null;try {    state.executeUpdate();    rs = state.getGeneratedKeys();    if (rs.next()) {        ret = (Serializable) rs.getObject(1);    }} catch (SQLException e) {}return ret;

总结一下,在mysql中做完插入之后获取id在高并发的时候是很容易出错的。另外last_insert_id虽然是基于session的但是不知道为什么没有测试成功。

方法6:selectkey:

其实在ibtias框架里使用selectkey这个节点,并设置insert返回值的类型为integer,就可以返回这个id值。

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。

不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。545bcd63c8d40deb7f9979987c1b0db8.png

SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。

像Oracle这样取序列的情况,需要设置为before,否则会报错。

另外在用Spring管理事务时,SelectKey和插入在同一事务当中,因而Mysql这样的情况由于数据未插入到数据库中,所以是得不到自动增长的Key。取消事务管理就不会有问题。

下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了:

   insert into table1 (name) values (#{name})          CALL IDENTITY()    

上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。

@Insert("insert into table2 (name) values(#{name})")@SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)int insertTable2(Name name);

上面是注解的形式。

方法:7:使用

1.在Mybatis Mapper文件中添加属

性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名,而不是表格的字段名。

       insert into system(name) values(#{name})

2.Mybatis执行完插入语句后,自动将自增长值赋值给对象systemBean的属性id。因此,可通过systemBean对应的getter方法获取!

int count = systemService.insert(systemBean);        int id = systemBean.getId(); //获取到的即为新插入记录的ID

# 注意事项

1.Mybatis Mapper 文件中,“useGeneratedKeys”和“keyProperty”必须添加,而且keyProperty一定得和java对象的属性名称一直,而不是表格的字段名

2.java Dao中的Insert方法,传递的参数必须为java对象,也就是Bean,而不能是某个参数。

3、在进行自增设计的时候,要注意某些关键字,像replace into以及INSERT ... ON DUPLICATE KEY UPDATE 等语句会产生的影响

对于mysql的相关知识,其实说多也多,说少也少,但是现在除了在笔试的时候写sql语句之外,可能更多的是对实际生产场景的应用,也就是mysql的调优,虽然没有办法帮大家找实际的生产场景进行真实的演示,但是,为大家找点资料还是没什么太大的问题的,结合mysql面试时常问的调优问题,有相应的视频讲解,帮助你更好的理解相应的知识点,没办法啊,兄弟就能帮你到这里了4537d8c70b9e55f90a921314cfc49c27.png

别着急划走,还有惊喜在等你,这些资料是我家里有几个小祖宗,在准备面试的时候,给他们搜集和整理的部分资料,也分享给大家,有需要的朋友,欢迎关注+转发,然后私信“资料”即可查看获取方式6af989eb81cb517cf72bfa4cce6a64d0.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35844772/article/details/113464932

智能推荐

在Qt中使用OpenGL(二)_qt opengl pdf-程序员宅基地

文章浏览阅读1.2w次,点赞33次,收藏112次。Qt使用OpenGL绘图的最简单流程_qt opengl pdf

ASPP 语义分割(semantic segmentation)--DeepLabV3之ASPP(Atrous Spatial Pyramid Pooling)代码详解_级联aspp-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏7次。ASPP: Atrous Spatial Pyramid Poolingdeeplabv2中的aspp如上图所示,在特征顶部映射图使用了四中不同采样率的空洞卷积。这表明以不同尺度采样时有效的,在Deeolabv3中向ASPP中添加了BN层。不同采样率的空洞卷积可以有效捕获多尺度信息,但会发现随着采样率的增加,滤波器有效权重(权重有效的应用在特征区域,而不是填充0)逐渐变小。如下图当我们以不同采样率的3*3卷积核..._级联aspp

安卓手机测评_鲁大师安卓新机流畅度排行榜更新,骁龙865加持,小米夺得榜首...-程序员宅基地

文章浏览阅读173次。近日,国内顶尖电脑系统检测工具鲁大师对外更新了今年8月份的安卓手机流畅度排行榜。鲁大师数据中心团队在8月份新发布的安卓手机中进行了系统文件拷贝、桌面切屏、网页界面加载缓存等操作测评,从多角度、多方面综合所有测评数据进行整理分析后得出手机系统的优化程度和适配性分数,最后将综合后的流畅度分数进行了排列。在鲁大师8月安卓新机流畅度排行榜单中,小米10至尊纪念版分数为187.91,登上榜单首位。第二名至第...

谷歌浏览器出现应用程序无法启动,因为应用程序的并行配置不正确....(亲测完美解决)_google应用程序无法启动-程序员宅基地

文章浏览阅读6.2w次,点赞43次,收藏50次。电脑开机完整报错提示为:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。刚开始也在网上找了N久的解决方案(如:启动windws Modules installer、安装VC等软件、或者重装浏览器,但是书签太多备份复杂。。。。)最终是发现确实配置版本信息的文件文件所在路径:C:\Program Files ..._google应用程序无法启动

对于第三方包概念的一些整理_第三方包是什么意思-程序员宅基地

文章浏览阅读681次。对于第三方包概念的一些整理什么是包?Node.js 中的第三方模块又叫做包,不同于 Node.js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用,Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用为什么需要包1.由于 Node.js 的内置模块仅提供了一些底层的 API,导致在基于内置模块进行项目开发的时,效率很低2.包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率3.包和内置模块之间的关系,类似于 jQuery_第三方包是什么意思

银行软件测试面试问题_银行软件测试面试常见问题答案-程序员宅基地

文章浏览阅读693次。测试技术面试题1、什么是兼容性测试?兼容性测试侧重哪些方面?参考答案:兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行,即是通常说的软件的可移植性。兼容的类型,如果细分的话,有平台的兼容,网络兼容,数据库兼容,以及数据格式的兼容。兼容测试的重点是,对兼容环境的分析。通常,是在运行软件的环境不是很确定的情况下,才需要做兼容。根据软件运行的需要,或者根据需求文档,一般都能够得出用户会在什么环境下使用该软件,把这些环境整理成表单,就得出做兼容测试的兼容环境了。兼容和配置_银行软件测试面试常见问题答案

随便推点

CentOS 7中安装配置JDK 1.7-程序员宅基地

文章浏览阅读432次。前言简单记录一下在CentOS 7中安装配置JDK 1.7的全过程~下载首先是jdk 1.7 64bit & 32bit的下载地址:jdk-7u79-linux-x64.tar.gz (http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz) jdk-7u79-linux...

GAN的理解与TensorFlow的实现 谷磊_gan的tensorflow实现-程序员宅基地

文章浏览阅读2.4k次。对应的github:https://github.com/burness/tensorflow-101近年来,基于数据而习得“特征”的深度学习技术受到狂热追捧,而其中GAN模型训练方法更加具有激进意味:它生成数据本身。GAN是“生成对抗网络”(Generative Adversarial Networks)的简称,由2014年还在蒙特利尔读博士的Ian Goodfellow引入深度学习领域。201..._gan的tensorflow实现

总结ctf中 MD5 绕过的一些思路_ctf md5-程序员宅基地

文章浏览阅读1.1w次,点赞28次,收藏118次。总结ctf中 MD5 绕过的一些思路,包括在PHP弱类型比较中 0e 、数组、MD5后的值等于原值,以及强比较的MD5碰撞_ctf md5

【Ubuntu】将Qt程序打包制作成deb_qt打包成deb-程序员宅基地

文章浏览阅读1.5k次。如果使用环境是x86可以直接下载,下载地址如果使用环境是嵌入式,需要下载linuxdeployqt源码,自行编译。_qt打包成deb

dubbo service注解用法_解决dubbo的服务发布注解@service不能和事务注解不能共用的方案...-程序员宅基地

文章浏览阅读2.3k次。最近在项目的开发中遇到了一个问题,就是服务提供方使用@service发布dubbo服务时候,服务消费方@Reference无法注入bean导致空指针异常的问题。分析原因为@service注解并没有将服务发布出去而导致的。所以解决问题的关键点在于如何将服务正确的发布出去。事务采用了aop技术,而aop默认采用的是基于JDK的动态代理(接口代理),所以在服务发布的时候无法确定使用接口类还是真实类,从而..._dubboservice注解 interfacename

搭建文件服务器_文件服务器搭建-程序员宅基地

文章浏览阅读8.4k次,点赞3次,收藏40次。文件服务器,又称档案伺务器,是指在计算机网络环境中,所有用户都可以访问的文件存储设备。下面是搭建文件服务器的步骤:1.打开Windows服务管理器<仪表盘,选择“添加角色和功能”2.到这里选择文件服务器相应功能安装3.安装完成后在这里打开文件和存储服务打开后在共享里创建文件共享因为SMB与Windows更结合所以选择SMB高级共享这里选择共享路径指定共享的名称这里全部勾选4.自定义文件权限禁用继承添加权..._文件服务器搭建

推荐文章

热门文章

相关标签