使用PostgreSQL时,我不得不将序列名称传递给lastInsertId()。这让我觉得查询没有从带有id的数据库返回,而是lastInsertId($ seqname)执行额外的查询,可能容易出现竞争条件(如果同时插入另一行,我会得到错误的结果。)
阅读文档后,我发现了这条评论,它显示了同样的想法:http://www.php.net/manual/en/pdo.lastinsertid.php#83440。它已经5岁了,我找不到更新的东西了。
您怎么看?
答案 0 :(得分:3)
为了让您可靠,您必须:
lastInsertId
,对同一会话执行后续查询。 PDO使用INSERT ... RETURNING
并从结果集中获取插入的ID会更好,很多。这样你就可以获得理智的价值:
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
代替。
答案 1 :(得分:2)
我打赌它使用SELECT currval('seq_name')
,它返回最后生成的每个连接。所以它可以信任。
答案 2 :(得分:1)
序列'唯一的目的是保持一致性。
否则他们就没用了。