最后插入ID方法可靠吗

时间:2018-10-10 08:48:49

标签: php mysql pdo last-insert-id

以下情况。

我们有2个脚本,都插入表中,然后使用module.exports = () => { router.route('/') // route definition router.use("/entity1", require("routes/entity1")()); return router; } 从自动增量列中获取值。

如果这两个脚本并行执行,我们是否确定它们不会弄乱结果?


实时:

时间1:脚本1->插入。 (创建的ID = 1)

时间1:脚本2->插入。 (创建的ID = 2)

(数据库可能使用锁/信号量来处理此问题)

Q1。时间2:脚本2-> lastInsertId()返回1还是2?是确定性的吗?

第二季度。那么顺序插入呢?

lastInsertId()

script.php

2 个答案:

答案 0 :(得分:4)

是的,这很可靠。

如果您认为一个表每秒将有成百上千的插入,请考虑不要使用索引或使用最少数量的索引。如果使用MySQL,则偏爱MyISAM表。

就您而言,

Q1。时间2:脚本2-> lastInsertId()返回1还是2?是确定性的吗?

返回第二个查询的ID。

第二季度。那么顺序插入呢?

您必须确保在插入查询之后询问lastInsertId。

希望它能对您有所帮助。

答案 1 :(得分:1)

是的,这很可靠。

顾名思义,

lastInsertId()确实保留最后插入行的 id(主键)

关于 Q1:的答案是2,因为那是最后插入的行。

当涉及到顺序插入时,如果您想“做某事” ,涉及到lastInsertId()的使用,那么您将必须声明lastInsertId()在执行的查询行之后(这很重要)> EXACTLY 。这样,您一定会保留要使用的 id

->an insert query is executed
->lastInsertId() is stored into a variable
->variable is used for something
->another insert query is executed
->another lastInsertId is stored into a variable
->variable is used for something.
etc...

相同的逻辑适用于循环。

您不一定必须将lastInsertId()存储到一个变量中,但是如果您使用的是PHP,并且需要将其用于多种用途,那么这是有意义的。如果没有,那么您可以直接在相关查询中直接使用它。但是请记住,它必须精确地位于您要使用的 id 的指定插入之后。

逻辑失败的示例:

<?php
//I want to get id 1
$statement1->insert('john'); // id = 1
$statement2->insert('mary'); // id = 2
$lastId=$statement1->lastInsertId();
?>

这将是一个失败的逻辑,因为我的意图是检索ID 1,但是由于我正在等待在语句2之后而不是语句1之后检索lastInsertId(),所以我的lastInsertId()等于改为2而不是1。

工作逻辑:

<?php
//I want to get id 1
$statement1->insert('john'); // id = 1
$lastId=$statement1->lastInsertId();
//do something with $lastId? (value will be 1)
//get contact info from a theoretical contact info table
$sql="SELECT * FROM tbl_contacts WHERE userId='$lastId'";
$statement2->insert('mary'); // id = 2
$lastId=$statement2->lastInsertId();
//do something with $lastId? (value will be 2)
?>

此逻辑将起作用,因为我正在检索所需的 id 值,并在被另一个 id 覆盖之前使用它们。 / p>

您当然可以使包含lastInsertId()值的变量唯一,以使它们不会被覆盖,然后您可以随时使用它们。