1

使用 PostgreSQL 时,我不得不将序列的名称传递给 lastInsertId()。这让我认为查询没有从数据库返回 id,而是 lastInsertId($seqname) 正在执行一个额外的查询,可能容易出现竞争条件(如果同时插入另一行,我会得到错误的结果)。

阅读文档我发现了这条评论,它显示了同样的想法:http ://www.php.net/manual/en/pdo.lastinsertid.php#83440 。它已经 5 年了,我找不到任何更新的东西。

你怎么看?

4

3 回答 3

4

为此,您必须:

  • 一次只插入一条记录;
  • 指定序列名称;和
  • 对同一个会话执行后续查询,可以使用会话级连接池,也可以使用事务级池并 lastInsertId在同一事务中执行插入操作。

PDO 使用并从结果集中获取插入的 ID会好得多。INSERT ... RETURNING这样,当你这样做时,你会得到一个理智的价值:

INSERT INTO mytable(col1,col2)
VALUES (1,'a'),  (2,'b'),  (3,'c')
RETURNING id;

lastInsertId您将仅获得插入的最后一行的 ID - 您不能假设前面的行具有连续的 ID。如果lastInsertId42,则不能保证前面的行是4140因为可能有并发插入也声称 ID。

所以“lastInsertId安全”的答案是……有点。如果在正确使用 所需的约束范围内使用它是安全的currval,但它远非理想。我个人会避免使用它并改用它INSERT ... RETURNING

于 2013-08-09T15:10:18.363 回答
2

我打赌它使用SELECT currval('seq_name'),它返回每个连接最后生成的。所以是可以信任的。

于 2013-08-09T14:42:17.867 回答
1

序列的唯一目的是保持一致性。

否则它们将毫无用处。

于 2013-08-09T14:40:55.393 回答