以下情况。
我们有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
答案 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()
值的变量唯一,以使它们不会被覆盖,然后您可以随时使用它们。