获取最后一个插入ID显示错误的数字

时间:2016-04-12 12:45:36

标签: mysql lastinsertid

我有三张唱片的桌子。有一个归档为auto_increment。 ID是1,2,3 ......

当我运行查询

SELECT LAST_INSERT_ID() FROM myTable

结果是5,即使最后一个ID是3.为什么?

什么是更好用? LAST_INSERT_ID()或SELECT MAX(ID)FROM myTable?

5 个答案:

答案 0 :(得分:3)

last_insert_id()与特定表无关。在同一个连接中,所有表共享相同的内容。

下面是它的演示。

演示:

mysql> create table t1(c1 int primary key auto_increment);
Query OK, 0 rows affected (0.11 sec)

mysql> create table t2(c1 int primary key auto_increment);
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 values(null);
Query OK, 1 row affected (0.01 sec)

mysql> insert into t2 values(4);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(null);
Query OK, 1 row affected (0.02 sec)

mysql> select last_insert_id() from t1;
+------------------+
| last_insert_id() |
+------------------+
|                5 |
+------------------+
1 row in set (0.00 sec)

答案 1 :(得分:3)

LAST_INSERT_ID() function仅将最新INSERT操作的最新自动增量id值返回到MySQL连接上的任何表。

如果您还没有完成INSERT,则会返回不可预测的值。如果您连续执行多个INSERT个查询,则会返回最新的查询ID。以前的ID丢失了。

如果您在MySQL事务中使用它,那么您刚刚插入的行在提交事务之前不会对另一个连接可见。因此,如果您通过代码调试它,似乎没有与所返回的LAST_INSERT_ID()值匹配的行。

您不必在事务中使用它,因为它是特定于连接的值。如果你有两个连接(两个MySQL客户端程序)插入东西,它们每个都有LAST_INSERT_ID()的不同值,用于他们正在进行的INSERT操作。

编辑如果您尝试创建父子关系,例如姓名和电子邮件地址,您可以尝试这种MySQL语句序列。

 INSERT INTO user (name) VALUES ('Josef');
 SET @userId := LAST_INSERT_ID();
 INSERT INTO email (user_id, email) VALUES (@userId, 'josef@example.com');
 INSERT INTO email (user_id, email) VALUES (@userId, 'josef@josefsdomain.me');

使用LAST_INSERT_ID()在插入后从user行获取自动增量ID。然后它在@userId中复制该id,并使用它两次,在子表中插入两行。通过使用更多INSERT INTO email个请求,您可以为单个父行插入任意数量的子行。

专业提示SELECT MAX(id) FROM table糟糕,糟糕的方法,可以找出最近插入行的ID。它很容易受到竞争条件的影响。因此,在您开始扩展应用程序之前它将正常工作,然后它将开始随机返回错误的值。这会破坏你的周末。

答案 2 :(得分:1)

我不认为这个功能符合你的想法。它返回当前连接上插入的最后一个id。

如果将其与SELECT MAX(ID)进行比较,则无论连接如何都会选择最高ID,请注意不要让它们混淆,否则会出现意外结果。

至于为什么它显示5可能因为它是最后一个要插入的id,我相信即使记录被删除,这个值也会保留,也许有人可以证实这一点。

答案 3 :(得分:0)

在此可以挽救表级触发器。例如在插入触发器之前。

答案 4 :(得分:-1)

也许您应该重新启动数据库连接,然后重新连接以获取新数据