可以信任$ pdo-> lastInsertId($ seqname)吗?

时间:2013-08-09 14:37:49

标签: php postgresql pdo

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

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

您怎么看?

3 个答案:

答案 0 :(得分:3)

为了让您可靠,您必须:

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

PDO使用INSERT ... RETURNING并从结果集中获取插入的ID会更好,很多。这样你就可以获得理智的价值:

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

使用lastInsertId,您只会获得插入的最后一行的ID - 并且不能假设先前的行具有连续的ID。如果lastInsertId42,则没有保证以前的行为4140,因为可能还有声明ID的并发插入。

所以“lastInsertId安全”的答案是......有点儿。如果在正确使用currval所需的约束条件下使用它是安全的,但它远非理想。就个人而言,我会避免使用INSERT ... RETURNING代替。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

否则他们就没用了。