理解Mysql语句:insert 表名 select null 及 select last_insert_id()
来源:互联网 发布:java 跨域上传文件 编辑:程序博客网 时间:2024/06/08 08:50
一、问题
看代码的时候,在项目的sqlMap.xml里看到了这样语句:
<insert id="add"> insert <include refid="tableName"/> select null ; <selectKey resultClass="long" > select last_insert_id() as ID ; </selectKey> </insert>
1.那个select null是什么鬼?
2.在并发环境下,用:select last_insert_id() as ID 不会有问题吗?
二、结果
1.将表的字段值设置为null,不能把select null放到一起看。
2.不会,Mybatis用了ThreadLocal
三、分析
后来仔细看,其实是这样的:
1.批量插入数据的语法
INSERT INTO 表名(字段1, 字段2) SELECT 字段1的值1, 字段2的值1 UNION SELECT 字段1的值2, 字段2的值2
关键字INTO可以省略,并且项目中我们只单个插入,故可简写为:
<pre name="code" class="sql">INSERT <span style="font-family: Arial, Helvetica, sans-serif;">表名(字段1, 字段2) </span><span style="font-family: Arial, Helvetica, sans-serif;">SELECT 字段1的值1, 字段</span><span style="font-family: Arial, Helvetica, sans-serif;">2的值1</span>
3.又项目中的表只有主键一个字段,又可简写为
INSERT 表名 SELECT 主键字段的值
4.于是SQL:
insert <include refid="tableName"/> select null ;
的意思就是:把这个表的主键设置为null
5.我们知道主键是唯一且不为空的,在设置了自动递增后,
如果插入时把主键设置为null,它都会不理你,傲娇的继续自增。
6.总结,项目里这么用应该是为了保证自增的连贯性。保证值不被程序修改。
四、用select last_insert_id()的风险
1.只有在主键设置了自动增长的时候可用
2.select last_insert_id()是返回最后一次插入的Id,如果插入了多条,只返回最后执行插入的那条的ID
3.主键设置了自动增长后,如果插入的ID是手动设置的,则select last_insert_id()不会返回当前插入的id,
而是上次通过自动增长插入成功的ID,如下图:
0 0
- 理解Mysql语句:insert 表名 select null 及 select last_insert_id()
- INSERT INTO t_inertupdate_tmp(a,b,c) select * 表名 where 字段名 is not null
- 【转载】在mysql中获取insert插入数据的id的方法SELECT LAST_INSERT_ID();
- insert select 插入语句
- insert into select 语句
- oracle insert select语句
- insert into select 语句
- INSERT...SELECT 语句和SELECT...INTO 语句
- 表复制语句(SELECT INTO 和 INSERT INTO SELECT )
- sql 语句:SELECT INTO 和 INSERT INTO SELECT 表复制
- 表的复制语句: select into 和 insert into select
- Insert into select表复制语句
- INSERT INTO SELECT 表复制语句
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- 根据表名自动生成INSERT,UPDATE,DELETE,SELECT的SQL语句
- MYSQL INSERT ... SELECT
- Hadoop-写入数据的几种方式
- 一些简单常见的html标签
- 【matlab】:matlab的linspace函数解析
- POJ 3469 Dual Core CPU(最小割)
- 大苏打
- 理解Mysql语句:insert 表名 select null 及 select last_insert_id()
- GeoServer安装和部署shp文件
- 监听键盘是否在界面上
- Oracle附加数据库
- 安卓系统Launcher的开发(转)
- iOS学习笔记——iOS组件之UIScrollView详解
- 高通平台手机开发之LCD
- 关于屏幕适配的一些看法
- 谈谈java中的WeakReference