Jos*_*sef 5 mysql lastinsertid
我有三个记录的表.有一个归档为auto_increment.身份证是1,2,3 ......
当我运行查询
SELECT LAST_INSERT_ID() FROM myTable
Run Code Online (Sandbox Code Playgroud)
结果是5,即使最后一个ID是3.为什么?
什么是更好用?LAST_INSERT_ID()或SELECT MAX(ID)FROM myTable?
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)
Run Code Online (Sandbox Code Playgroud)
该LAST_INSERT_ID()函数仅将最近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');
Run Code Online (Sandbox Code Playgroud)
这用于在插入后LAST_INSERT_ID()从user行中获取自动递增的 ID 。然后它在 中复制该 id @userId,并使用它两次,以在子表中插入两行。通过使用更多INSERT INTO email请求,您可以为单个父行插入任意数量的子行。
专业提示:SELECT MAX(id) FROM table是找出最近插入的行的糟糕方法ID。它很容易受到竞争条件的影响。所以它会正常工作,直到你开始扩展你的应用程序,然后它会开始随机返回错误的值。那会毁了你的周末。