您的当前位置:首页正文

关于MySQL提供的Last_insert_id()函数使用的理解

2023-11-09 来源:要发发知识网

最后一个insert或update查询中设置为AUTO_INCREMENT列的值

Last_insert_id()不受其他客户端影响,所以是线程安全的,当前客户端只能拿到当前客户端的最新值,不需加锁处理

mybatis中的userGeneratedKeys="true" keyProperty="id"可能就是使用Last_insert_id()函数实现的

关于MySQL提供的Last_insert_id()函数使用的理解

标签:

小编还为您整理了以下内容,可能对您也有帮助:

mysql SELECT @last := LAST_INSERT_ID(); 这个语句怎么看呢。。

你可以认为这是用select 声明变量和初始化变量的一种方式。

别的数据库不这么写,比如sqlserver 如果这么写肯定让你先声明。

--------

SELECT @last := LAST_INSERT_ID()

变量是 @last

:=是赋值

LAST_INSERT_ID()

返回最后一个 INSERT 或 UPDATE 操作为 AUTO_INCREMENT 列设置的最新发生的值.

LAST_INSERT_ID是基于单个connection的, 不可能被其它的客户端连接改变。

比如说你有一个表A,A里有一个自增列。

当你插入一条记录后,自增列到 3 ,那么

LAST_INSERT_ID() 在当前连接中

就返回3

--

SELECT @last := LAST_INSERT_ID() as 最后一次自增列的值。

这个函数跟表无关联。

问,mysql里怎样取得刚插入记录的id

1。MYSQL使用SQL函数LAST_INSERT_ID()获得刚刚插入的AUTO_INCREACE字段的ID值。必须前一SQL为一INSERT语句,如果是其他语句,返回的ID值为零。
2。使用Command对象的时候,注意不能关闭对象后再用SELECT LAST_INSERT_ID()函数,这样获得的ID值同样为零。必须是刚INSERT完,而无新的其他语句,也未关闭该对象,立即使用该函数才可正确获得。范例如下:editQuery = INSERT INTO 表名(。。。列名。。。) VALUES(。。。值名。。。)

问,mysql里怎样取得刚插入记录的id

1。MYSQL使用SQL函数LAST_INSERT_ID()获得刚刚插入的AUTO_INCREACE字段的ID值。必须前一SQL为一INSERT语句,如果是其他语句,返回的ID值为零。
2。使用Command对象的时候,注意不能关闭对象后再用SELECT LAST_INSERT_ID()函数,这样获得的ID值同样为零。必须是刚INSERT完,而无新的其他语句,也未关闭该对象,立即使用该函数才可正确获得。范例如下:editQuery = INSERT INTO 表名(。。。列名。。。) VALUES(。。。值名。。。)

高并发性的数据库操作-Mysql

使用SELECT LAST_INSERT_ID() 函数就可以,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update 操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录, LAST_INSERT_ID返回一个列表。追问可是我的程序是公用conn对象的吧
我用的PHP编的,在需要数据库连接的地方,就include(conn.php),这样连接对象是不是公用的啊?

追答include(conn.php)相当于把conn.php拷贝到当前位置,基本上和复制、粘贴文件的效果相同。

只要不是使用的永久连接,你的connect就是私有的。

高并发性的数据库操作-Mysql

使用SELECT LAST_INSERT_ID() 函数就可以,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update 操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录, LAST_INSERT_ID返回一个列表。追问可是我的程序是公用conn对象的吧
我用的PHP编的,在需要数据库连接的地方,就include(conn.php),这样连接对象是不是公用的啊?

追答include(conn.php)相当于把conn.php拷贝到当前位置,基本上和复制、粘贴文件的效果相同。

只要不是使用的永久连接,你的connect就是私有的。

mysql insert一条记录后怎样返回创建记录的主键id,last

mysql

insert一条记录后怎样返回创建记录的

主键

id,last

使用

mysqli

的方法是:

$mysqli->insert_id

是返回刚刚插入的那条记录的

id

SELECT

LAST_INSERT_ID()

是返回最后插入的记录id

如何获取自增id

去"O"的业务支撑的时候,遇到一个开发询问如何获取到MySQL 的自增id,这里做一个总结,我们可以通过四种方式来获取MySQL 的自增id。

一 last_insert_id()

官方介绍如下:

“The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. ”

last_insert_id() 单个会话中最近一次执行的insert语句时表的自增id的值。不受其他的会话插入影响。

如果是新建的表,它的值为0

root@rac3 [yangyi]> create table t2(id int not null auto_increment primary key ,col varchar(10));

Query OK, 0 rows affected (0.11 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 0 |

+------------------+

1 row in set (0.01 sec)

如果向表中插入的记录,id自增,它的值为max(id),如果指定插入的id ,它的值为上一次插入的最大值。

root@rac3 [yangyi]> insert into t3 values(null,'sss');

Query OK, 1 row affected (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 1 |

+------------------+

1 row in set (0.00 sec)

root@rac3 [yangyi]> insert into t3 values(2,'sss');

Query OK, 1 row affected (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 1 |

+------------------+

1 row in set (0.00 sec)

使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 3 |

+------------------+

1 row in set (0.01 sec)

root@rac3 [yangyi]> insert into t1 values(null,'sss'),(null,'dd'),(null,'aaa');

Query OK, 3 rows affected (0.00 sec)

Records: 3 Duplicates: 0 Warnings: 0

root@rac3 [yangyi]> select * from t1;

+----+------+

| id | col |

+----+------+

| 1 | sss |

| 2 | sss |

| 3 | sss |

| 4 | sss |

| 5 | dd |

| 6 | aaa |

+----+------+

6 rows in set (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 4 |

+------------------+

1 row in set (0.00 sec)

last_insert_id 是与表无关的,如果向表a插入数据后,再向表b插入数据,last_insert_id 返回表b的Id值!

root@rac3 [yangyi]> insert into t2 values(null,'sss');

Query OK, 1 row affected (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();

+------------------+

| last_insert_id() |

+------------------+

| 11 |

+------------------+

1 row in set (0.00 sec)

root@rac3 [yangyi]> insert into t1 values(null,'sss');

Query OK, 1 row affected (0.00 sec)

root@rac3 [yangyi]> select @@identity;

+------------+

| @@identity |

+------------+

| 3 |

+------------+

1 row in set (0.00 sec)

二 使用@@identity

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。

其特性last_insert_id 一样.

三 使用max(id)

select max(id) from tab; 返回的是tab 的最大id值。

使用max(id) 只能针对单个表获取最大的id,而且高并发情况下,必须加上'X' 锁才能获取会话当前的最大id,显然加锁会严重影响并发性能。

四 查看表结构

root@rac3 [yangyi]> show table status like 't3' \G

*************************** 1. row ***************************

Name: t3

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 2

Avg_row_length: 8192

Data_length: 16384

Max_data_length: 0

Index_length: 0

Data_free: 0

Auto_increment: 3

Create_time: 2014-05-06 20:36:00

Update_time: NULL

Check_time: NULL

Collation: utf8_bin

Checksum: NULL

Create_options:

Comment:

1 row in set (0.00 sec)

root@rac3 [yangyi]> show create table t3 \G

*************************** 1. row ***************************

Table: t3

Create Table: CREATE TABLE `t3` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`col` varchar(10) COLLATE utf8_bin DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

1 row in set (0.00 sec)

五 总结

我们知道MySQL 使用auto_increment 属性来实现自增id,这点与oracle 的sequence 不同,auto_increment 是基于表的而非全局。从oracle 到mysql 的dba 要注意改变对sequence 使用方式的转变。