当一个页面中包含了多个表存储的时候,这时候需要有个主键进行更新其他表。比如:新增用户信息,但是 用户信息包含的一部分信息在其它表中,这时候你需要通过用户id来进行add,这时候你如果用普通的insert,只会返回0和1,这时候就需要用到这个函数了。
目录
函数介绍
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 rows
-
-
mysql>
INSERT
INTO t (val)
VALUES (
1),(
2);
-
-
# With auto_increment_offset=1, the inserted rows
-
# result in an AUTO_INCREMENT value of 3
-
-
mysql>
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 column
-
-
mysql>
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 rows
-
-
mysql>
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 unsuccessful
-
-
mysql>
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
)SELECT
SET
参考文档:
MySQL :: MySQL 5.7参考手册:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id