从 mysql 中的表中查找最后插入的 id
许多关于在 mysql 中查找一个表的最后插入 id 的文章。但是,很难找到任何关于使用两个表查找最后插入的 id 的教程。
在本文中,我们将尝试解决这种特殊情况,当然,我们还将探讨何时使用 last_insert_id()
命令。首先,让我们看看 auto_increment
是什么 id 以及它与 last_insert_id()
的关系。
mysql 中的 auto_increment
id 是什么
在处理数据库时,我们通常需要特定表的 id 来作为主键。因为主键标识数据库中的记录,所以它必须是唯一的。
但是,我们如何保证主键始终是唯一的呢?另一种选择是使用一个公式来构造主键,该公式在添加数据之前验证该键在数据库中的存在。
这种策略可能会奏效,但它是困难的,而且并非万无一失。我们可以利用 mysql 的 auto_increment()
函数来创建主键以避免这种复杂性并确保它们始终是唯一的。
对于 int
数据类型,采用自动增量。int
数据类型有符号和无符号都支持值。
无符号
数据类型只能存储正数。当新记录输入数据库时,自动增量允许自动创建唯一编号。
让我们看一个例子。
createtablecars(caridintnotnullauto_increment,namechar(30)notnull,primarykey(carid));
在我们现在创建表之后,我们可以插入值。我们也不需要为 carid
列指定值。
insertintocars(name)values('bmw'),('mercedes'),('audi');select*fromcars;
输出:
---- ---------
| carid | name |
---- ---------
| 1 | bmw |
| 2 | mercedes|
| 3 | audi |
---- ---------
默认情况下,它将以 1
作为起始值,递增 1。如果我们需要从另一个值开始,我们可以更改新的值表。
altertablecarsauto_increment=32;
最后,我们在定义自增数字的数据类型时需要小心。例如,如果我们将其设置为 tinyint
,它将限制记录数为 255。
我们可以使用 int
数据类型,因为它的限制足够大。所以现在我们对 auto_increment
函数了解很多,我们可以继续 last_insert_id()
函数。
在 mysql 中查找 auto_increment
列的最后插入 id
由于最近执行的 insert
语句,last_insert_id
返回为 auto_increment
列插入的第一个生成的 int
。如果插入失败,则最后插入的 id 的值不会改变。
我们将为上面创建的表执行它。
selectlast_insert_id();
输出:
------------------
| last_insert_id() |
------------------
| 1 |
------------------
如你所见,即使 insert
语句在 cars
表中插入了三行,成功插入的第一行也是 id=1
的行。假设我们需要 insert
语句中的最后一个 id(在本例中为:3)。
我们将利用 mysql 的 max
函数。它返回当前特定列的最大值。
selectmax(carid)fromcars;
输出:
-----------
| max(carid)|
-----------
| 3 |
-----------
现在我们来分析另一种情况,我们是在一张一张的往两张表中插入数据的时候,我们需要得到第一张表最后插入的 id。
createtablecars(caridintnotnullauto_increment,namechar(30)notnull,primarykey(carid));createtablecarmodels(otheridintnotnull,modelidintnotnullauto_increment,namechar(30)notnull,primarykey(modelid));altertablecarmodelsauto_increment=4;insertintocars(name)values('bmw');insertintocarmodels(otherid,name)values(last_insert_id(),'f30');selectlast_insert_id();
输出:
------------------
| last_insert_id() |
------------------
| 4 |
------------------
首先,让我们了解我们已经执行的代码。我们创建了两个表,即 cars
和 carmodels
。
然后我们更改了 carmodels
的起始 id,以区分两个表的 id,并使用我们上面学习的方法将其设置为 4。我们可以从输出中看到它返回了第二个表的最后插入的 id。
如果我们需要最后插入的 cars
表 id 怎么办?
根据具体情况,我们可以通过多种方式做到这一点。我们将根据我们的情况来查看它们中的每一个。
在 mysql 中第一种方法:将 id 存储在变量中
在这种方法中,我们会将第一个表的最后插入的 id 存储在一个变量中,然后在第二个表中使用它,而不是直接调用 last_insert_id
。
insertintocars(name)values('bmw');set@last_id_in_cars=last_insert_id();insertintocarmodels(otherid,name)values(@last_id_in_cars,'f30');select@last_id_in_cars;
输出:
------------------
| @last_id_in_cars |
------------------
| 33 |
------------------
在选择变量之前,我们需要使用@
符号。
第二种方法:从 mysql 中的第二个表中检索最后插入的 id
这是我们示例的一个特殊情况,因为我们在第二个表中使用了第一个表的最后插入 id。所以我们将从第二个表中检索它。
insertintocars(name)values('bmw');insertintocarmodels(otherid,name)values(last_insert_id(),'f30');selectotheridfromcarmodelswheremodelid=last_insert_id();
从 cars
表中获取 max(carid)
:
我们已经学习了函数 max
并且可以在这个例子中使用它。
insertintocars(name)values('bmw');insertintocarmodels(otherid,name)values(last_insert_id(),'f30');selectmax(carid)fromcars;
但是,高级工程师不推荐这种方法,因为它会在竞态条件下出错。当多个线程可以同时访问共享数据时,就会出现竞争条件。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
如何在 mysql 中声明和使用变量
发布时间:2024/03/26 浏览次数:115 分类:mysql
-
当你需要在 mysql 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。
发布时间:2024/03/26 浏览次数:176 分类:mysql
-
本教程演示了如何在 mysql 中重置自动增量。
在 mysql 中使用 mysqladmin 刷新主机解除阻塞
发布时间:2024/03/26 浏览次数:82 分类:mysql
-
你将了解阻止主机的原因。此外,通过使用 phpmyadmin 和命令提示符刷新主机缓存来解除阻塞的不同方法和效果。
发布时间:2024/03/26 浏览次数:199 分类:mysql
-
本教程演示如何在 mysql 中转换为整数。