当一个页面中包含了多个表存储的时候,这时候需要有个主键进行更新其他表。比如:新增用户信息,但是 用户信息包含的一部分信息在其它表中,这时候你需要通过用户id来进行add,这时候你如果用普通的insert,只会返回0和1,这时候就需要用到这个函数了。

目录

函数介绍

举个例子

官方文档

LAST_INSERT_ID()

LAST_INSERT_ID(expr)


函数介绍

SELECT LAST_INSERT_ID() 即为获取最后插入的ID值

总体解释:将插入数据的主键返回到 object 对象中。
具体解释:

  • SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键;
  • keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性;
  • order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序,所以说 这个 selectKey 标签,放在前后都是可以的;
  • resultType:指定 SELECTLAST_INSERT_ID() 的结果类型;

举个例子

使用之前:

返回 的result 只有1,表示 add成功,但是从 temp 对象获取时,并没有数据。

使用之后:

不仅有result 等于1,而且 返回对象的 Id 可以获取到 为 31。

官方文档

此函数分为两种

LAST_INSERT_ID()

如果没有参数,则 LAST_INSERT_ID()返回一个 BIGINT UNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语句而成功为列添加 的第一个自动生成的值。LAST_INSERT_ID()如果没有成功插入行,则值 保持不变。

使用参数, LAST_INSERT_ID()返回无符号整数。

例如,在插入生成AUTO_INCREMENT值的行之后 ,您可以获得如下值:

mysql> SELECT LAST_INSERT_ID();-> 195

当前正在执行的语句不会影响其值 LAST_INSERT_ID()。假设您AUTO_INCREMENT使用一个语句生成一个值,然后LAST_INSERT_ID()在多行INSERT语句中引用 ,该行将行插入到具有自己AUTO_INCREMENT列的表中 。LAST_INSERT_ID()第二个陈述中的价值 将保持稳定; 它的第二行和后一行的值不受先前行插入的影响。(但是,如果将参考混合到LAST_INSERT_ID()和 ,则效果未定义。) LAST_INSERT_ID(expr)

如果前一个语句返回错误,则值为 LAST_INSERT_ID()undefined。对于事务表,如果语句由于错误而回滚,则值为 LAST_INSERT_ID()undefined。对于手动 ROLLBACK,其值LAST_INSERT_ID() 不会恢复到事务之前的值; 它仍然保持原样 ROLLBACK

在MySQL 5.7.3之前,如果正在使用复制过滤规则,则无法正确复制此函数。

在存储例程(过程或函数)或触发器LAST_INSERT_ID()的主体内,更改的值与在这些对象的主体外执行的语句的 更改方式相同。LAST_INSERT_ID()以下语句可以看出存储的例程或触发器对其值的影响 取决于例程的类型:

  • 如果存储过程执行更改值的语句,则更改的值LAST_INSERT_ID()将由过程调用之后的语句看到。

  • 对于更改值的存储函数和触发器,当函数或触发器结束时,将恢复该值,因此后续语句将不会看到更改的值。

生成的ID在每个连接的基础上在服务器中维护 。这意味着函数返回给定客户端的AUTO_INCREMENT是为该客户端影响AUTO_INCREMENT最新语句生成的第一个 值 。此值不受其他客户端的影响,即使它们生成 AUTO_INCREMENT自己的值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。

LAST_INSERT_ID() 如果将AUTO_INCREMENT行的列设置为非“ 魔术 ”值(即,不是NULL和不是 的值),则不会更改 值 0

如果您将使用一个多行 INSERT的语句, LAST_INSERT_ID()返回所产生的价值第一次插入的行。这样做的原因是可以轻松地重现INSERT与其他服务器相同的 语句。

mysql> USE test;mysql> CREATE TABLE t (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,name VARCHAR(10) NOT NULL);mysql> INSERT INTO t VALUES (NULL, 'Bob');mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+mysql> INSERT INTO t VALUES(NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+

虽然第二个INSERT 语句插入了三个新行t,但是为这些行中的第一行生成的ID是 2,并且这个值是由LAST_INSERT_ID()以下SELECT语句返回的 。

如果使用INSERT IGNORE并且忽略该行,则 LAST_INSERT_ID()保持与当前值保持不变(如果连接尚未成功INSERT,则返回0 ),对于非事务表,AUTO_INCREMENT计数器不会递增。对于InnoDB表,AUTO_INCREMENT如果innodb_autoinc_lock_mode设置为1或,则 计数器会递增 2,如以下示例所示:

mysql> USE test;mysql> SELECT @@innodb_autoinc_lock_mode;
+----------------------------+
| @@innodb_autoinc_lock_mode |
+----------------------------+
|                          1 |
+----------------------------+mysql> CREATE TABLE `t` (`id` INT(11) NOT NULL AUTO_INCREMENT,`val` INT(11) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i1` (`val`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;# Insert two rowsmysql> INSERT INTO t (val) VALUES (1),(2);# With auto_increment_offset=1, the inserted rows
# result in an AUTO_INCREMENT value of 3mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************Table: t
Create Table: CREATE TABLE `t` (`id` int(11) NOT NULL AUTO_INCREMENT,`val` int(11) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i1` (`val`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1# LAST_INSERT_ID() returns the first automatically generated
# value that is successfully inserted for the AUTO_INCREMENT columnmysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+# The attempted insertion of duplicate rows fail but errors are ignored   mysql> INSERT IGNORE INTO t (val) VALUES (1),(2);
Query OK, 0 rows affected (0.00 sec)
Records: 2  Duplicates: 2  Warnings: 0# With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter
# is incremented for the ignored rowsmysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************Table: t
Create Table: CREATE TABLE `t` (`id` int(11) NOT NULL AUTO_INCREMENT,`val` int(11) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i1` (`val`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1# The LAST_INSERT_ID is unchanged because the previous insert was unsuccessfulmysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+

LAST_INSERT_ID(expr)

如果expr作为参数给出,则参数 LAST_INSERT_ID()的值由函数返回,并记住作为要返回的下一个值 LAST_INSERT_ID()。这可以用来模拟序列:

创建一个表来保存序列计数器并初始化它:

<span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">CREATE</span> <span style="color:#0077aa">TABLE</span> sequence <span style="color:#999999">(</span>id <span style="color:#834689">INT</span> <span style="color:#a67f59">NOT</span> <span style="color:#990055">NULL</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#a67f59">mysql></span> <span style="color:#0077aa">INSERT</span> <span style="color:#0077aa">INTO</span> sequence <span style="color:#0077aa">VALUES</span> <span style="color:#999999">(</span><span style="color:#990055">0</span><span style="color:#999999">)</span><span style="color:#999999">;</span></code></span></span>

使用该表生成如下序列号:

<span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#a67f59">mysql></span> <span style="color:#0077aa">UPDATE</span> sequence <span style="color:#0077aa">SET</span> id<span style="color:#a67f59">=</span><span style="color:#dd4a68">LAST_INSERT_ID</span><span style="color:#999999">(</span>id<span style="color:#a67f59">+</span><span style="color:#990055">1</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
<span style="color:#a67f59">mysql></span> <span style="color:#0077aa">SELECT</span> <span style="color:#dd4a68">LAST_INSERT_ID</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span></code></span></span>

UPDATE语句递增序列计数器并使下一次调用LAST_INSERT_ID()返回更新的值。该 SELECT语句检索该值。

您可以在不调用的情况下生成序列 LAST_INSERT_ID(),但以这种方式使用函数的实用程序是ID值在服务器中作为最后自动生成的值进行维护。它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或 mysql_insert_id())获取自己的序列值 ,而不会影响或受到生成其自己的序列值的其他客户端的影响。

请注意,mysql_insert_id()只有更新后INSERT和 UPDATE语句,所以你不能使用C API函数来检索值 执行像其他SQL语句后 或 。 LAST_INSERT_ID(expr)SELECTSET

参考文档:

MySQL :: MySQL 5.7参考手册:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

MySQL - SELECT LAST_INSERT_ID() 使用总结相关推荐

  1. Mysql函数Last_insert_id()的真正含义

    2019独角兽企业重金招聘Python工程师标准>>> mysql手册中说SELECT last_insert_id()是多用户安全的. LAST_INSERT_ID() LAST_ ...

  2. Hibernate JPA中insert插入数据后自动执行select last_insert_id()解决方法

    本文出处:http://blog.csdn.net/chaijunkun/article/details/8647281,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  3. Postgres用returning实现mysql的last_insert_id

    为什么80%的码农都做不了架构师?>>>    今天开发问到,postgres里面有没有像mysql那样插入一个值后返回插入的值,这个是有的,而且有更强的扩展性.  示例: [pos ...

  4. mysql returning_Postgres用returning实现mysql的last_insert_id

    今天开发问到,postgres里面有没有像mysql那样插入一个值后返回插入的值,这个是有的,而且有更强的扩展性. 示例: [postgres@localhost ~]$ psql psql (9.2 ...

  5. mysql select * f

    mysql> select * from tb; +------+-------+ | id | name | +------+-------+ | 1 | tbone | | 3 | 2d2 ...

  6. mysql+select+unlock_MySQL的locktables和unlocktables的用法(转载)

    mysql select * from user; ----------------- | id| name| ----------------- |22 | abc| |223 | dabc| | ...

  7. mysql select语法_MySQL SELECT语法(一)SELECT语法详解

    SELECT的语法如下: SELECT[ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT ...

  8. Mysql Select 语句中实现的判断

    select *,if(sva=1,"男","女") as ssva from tableame where id =1 Quote 控制流程函数 CASE v ...

  9. mysql select表达式_MySQL数据库SELECT查询表达式解析

    数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHE ...

  10. mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询

    1.SELECT --group by 子句 group by子句按照指定的列column_name对表数据进行分组 group by 后面跟的列也叫分组特性列 使用group by后,能选择的列   ...

最新文章

  1. linux yum localinstall 解决本地rpm包的依赖问题
  2. 201521123054《Java程序设计》第1周学习总结
  3. 服务器数据缓存文件实现,跨域与缓存
  4. uac2.0驱动_关闭Vista中令人讨厌的HP驱动程序UAC弹出更新检查
  5. 解决正在等待响应_解决一些等待问题
  6. matlab与r语言运算速度,R语言与matlab循环时间对比
  7. 行为型设计模式(1)—— 责任链模式(Chain of Responsibility Pattern)
  8. 期待已久的Java 9 今日正式发布,新特性解读
  9. 百度图表echart使用心得
  10. SLAM--DBow3
  11. MAPX中的数据绑定问题
  12. 计算机辅助机械设计a卷,二维CAD工程师(机械设计)考试A卷
  13. mysql服务什么意思_mysql数据库服务是什么意思
  14. 8bit/10bit线路编码简介
  15. 华为项目管理金种子培训教材(资料下载)
  16. 视频去水印工具-在线短视频去水印工具
  17. 天津少儿编程培训班费用多少呢?值不值?
  18. 如何在ubuntu 16.04上安装WebERP
  19. 洛谷P1424 小鱼的航程(改进版)-c++题解
  20. 37互娱java待遇,37互娱现场java一面

热门文章

  1. 快速下载github上部分文件夹或文件
  2. 为什么使用Linux
  3. linux 模拟windows7,Linux游戏:原生、Wine模拟对比Windows 7
  4. diy计算机工作站,DIY 篇一:TU100组装移动工作站
  5. 面向对象------转自林海峰老师
  6. qq邮箱对方服务器退回,为什么我用QQ邮箱发邮件被退回来了?他说地 – 手机爱问...
  7. IBM FlashSystem掌控现代存储,靠的是硬实力
  8. 全面了解什么是TPS、QPS以及两者的区别
  9. 解读加拿大综合类大学排名 提升雅思成绩刻不容缓
  10. mysql 3个表左连接查询_MySQL数据库三个表的左连接查询(LEFT JOIN)