我有三张唱片的桌子。有一个归档为auto_increment。 ID是1,2,3 ......
当我运行查询
时SELECT LAST_INSERT_ID() FROM myTable
结果是5,即使最后一个ID是3.为什么?
什么是更好用? LAST_INSERT_ID()或SELECT MAX(ID)FROM myTable?
答案 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)
也许您应该重新启动数据库连接,然后重新连接以获取新数据