最后一个insert id方法可靠吗

efzxgjgh  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(332)

下面的场景。
我们有两个脚本,都插入到表中,然后使用 lastInsertId() 从自动增量列获取值。
如果这两个脚本并行执行,我们是否确定它们不会弄乱结果?
实时:
时间1:脚本1->插入(创建id=1)
时间1:脚本2->插入(创建id=2)
(数据库可能使用锁/信号量来处理)
问题1。时间2:script2->lastinsertid()返回1还是2?是确定性的吗?
问题2。顺序插入呢? script.php ```
$statement1->insert('john'); // id = 1
$statement2->insert('mary'); // id = 2

echo $statement1->lastInsertId();
// is it 1 or 2? Is this also deterministic?

d5vmydt9

d5vmydt91#

是的,它是可靠的。 lastInsertId() 顾名思义,是否保留最后插入行的id(主键)。
关于q1,答案是2,因为那是最后插入的一行。
当涉及到顺序插入时,您希望围绕使用 lastInsertId() ,那么你必须申报 lastInsertId() 正好在执行的查询行之后(这很重要)。这样,您就可以确保持有要使用的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指定的insert之后。
失败逻辑示例:

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

这将是一个失败的逻辑,因为我的目的是检索id 1,但因为我正在等待检索 lastInsertId() 在陈述2之后,而不是陈述1之后,我的 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覆盖之前使用它们。
当然,您可以使变量包含 lastInsertId() 值是唯一的,这样它们就不会被覆盖,然后您可以随时使用它们。

d7v8vwbk

d7v8vwbk2#

是的,它是可靠的。
如果您认为一个表每秒将有数百或数千个insert,请考虑不使用索引或使用最小数量的索引。如果是myisam表。
就你而言,
问题1。时间2:script2->lastinsertid()返回1还是2?是确定性的吗?
返回第二个查询的id。
问题2。顺序插入呢?
必须确保在insert查询之后询问lastinsertid。
我希望它能帮助你。

相关问题