下面的场景。
我们有两个脚本,都插入到表中,然后使用 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?
2条答案
按热度按时间d5vmydt91#
是的,它是可靠的。
lastInsertId()
顾名思义,是否保留最后插入行的id(主键)。关于q1,答案是2,因为那是最后插入的一行。
当涉及到顺序插入时,您希望围绕使用
lastInsertId()
,那么你必须申报lastInsertId()
正好在执行的查询行之后(这很重要)。这样,您就可以确保持有要使用的id。同样的逻辑也适用于循环。
你不一定要储存
lastInsertId()
但如果您使用的是php并且需要将其用于多种用途,则它是有意义的。如果没有,那么您可以直接在相关查询中使用它。但请记住,它必须正好位于为要使用的id指定的insert之后。失败逻辑示例:
这将是一个失败的逻辑,因为我的目的是检索id 1,但因为我正在等待检索
lastInsertId()
在陈述2之后,而不是陈述1之后,我的lastInsertId()
将等于2而不是1。工作逻辑:
这个逻辑将起作用,因为我正在检索我想要的id值,并在它们被另一个id覆盖之前使用它们。
当然,您可以使变量包含
lastInsertId()
值是唯一的,这样它们就不会被覆盖,然后您可以随时使用它们。d7v8vwbk2#
是的,它是可靠的。
如果您认为一个表每秒将有数百或数千个insert,请考虑不使用索引或使用最小数量的索引。如果是myisam表。
就你而言,
问题1。时间2:script2->lastinsertid()返回1还是2?是确定性的吗?
返回第二个查询的id。
问题2。顺序插入呢?
必须确保在insert查询之后询问lastinsertid。
我希望它能帮助你。