使用 PostgreSQL 时,我不得不将序列的名称传递给 lastInsertId()。这让我认为查询没有从数据库返回 id,而是 lastInsertId($seqname) 正在执行一个额外的查询,可能容易出现竞争条件(如果同时插入另一行,我会得到错误的结果)。
阅读文档我发现了这条评论,它显示了同样的想法:http ://www.php.net/manual/en/pdo.lastinsertid.php#83440 。它已经 5 年了,我找不到任何更新的东西。
你怎么看?
使用 PostgreSQL 时,我不得不将序列的名称传递给 lastInsertId()。这让我认为查询没有从数据库返回 id,而是 lastInsertId($seqname) 正在执行一个额外的查询,可能容易出现竞争条件(如果同时插入另一行,我会得到错误的结果)。
阅读文档我发现了这条评论,它显示了同样的想法:http ://www.php.net/manual/en/pdo.lastinsertid.php#83440 。它已经 5 年了,我找不到任何更新的东西。
你怎么看?
为此,您必须:
lastInsertId
在同一事务中执行插入操作。PDO 使用并从结果集中获取插入的 ID会好得多。INSERT ... RETURNING
这样,当你这样做时,你会得到一个理智的价值:
INSERT INTO mytable(col1,col2)
VALUES (1,'a'), (2,'b'), (3,'c')
RETURNING id;
lastInsertId
您将仅获得插入的最后一行的 ID - 您不能假设前面的行具有连续的 ID。如果lastInsertId
是42
,则不能保证前面的行是41
,40
因为可能有并发插入也声称 ID。
所以“lastInsertId
安全”的答案是……有点。如果在正确使用 所需的约束范围内使用它是安全的currval
,但它远非理想。我个人会避免使用它并改用它INSERT ... RETURNING
。
我打赌它使用SELECT currval('seq_name')
,它返回每个连接最后生成的。所以是可以信任的。
序列的唯一目的是保持一致性。
否则它们将毫无用处。