Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Can$pdo->;是否信任lastInsertId($seqname)?_Php_Postgresql_Pdo - Fatal编程技术网

Php Can$pdo->;是否信任lastInsertId($seqname)?

Php Can$pdo->;是否信任lastInsertId($seqname)?,php,postgresql,pdo,Php,Postgresql,Pdo,使用PostgreSQL时,我被迫将序列的名称传递给lastInsertId()。这让我觉得查询并没有从数据库返回id,相反,lastInsertId($seqname)正在执行一个额外的查询,可能容易出现竞争条件(如果同时插入另一行,我将得到错误的结果) 阅读文档时,我发现了这条评论,它表达了同样的想法:。已经5年了,我找不到比这更新的了 你怎么看?序列的唯一的目的是保持一致性 否则它们将毫无用处 序列的唯一的目的是保持一致性 否则它们将毫无用处 我打赌它使用SELECT currval('s

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

阅读文档时,我发现了这条评论,它表达了同样的想法:。已经5年了,我找不到比这更新的了


你怎么看?

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


否则它们将毫无用处

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


否则它们将毫无用处

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

我打赌它使用
选择currval('seq_name')
,它返回每个连接最后生成的一次。因此它是可信的。

要使其可靠,您必须:

  • 一次只插入一条记录
  • 指定序列名称;及
  • 在同一会话上执行后续查询,可以使用会话级连接池,也可以使用事务级池,并在同一事务中执行insert和
    lastInsertId
PDO最好使用
INSERT。。。返回
,并从结果集中获取插入的ID。这样,当您执行以下操作时,您将获得一个正常的值:

INSERT INTO mytable(col1,col2)
VALUES (1,'a'),  (2,'b'),  (3,'c')
RETURNING id;
使用
lastInsertId
您将只获得插入的最后一行的ID,并且您不能假设前面的行具有连续的ID。如果
lastInsertId
42
,则不能保证前面的行是
41
40
,因为可能同时存在声明ID的插入


所以“is
lastInsertId
safe”的答案是。。。有点。如果在正确使用
currval
所需的约束条件下使用,它是安全的,但这远远不够理想。就我个人而言,我会避免使用它,并使用
INSERT。。。返回

要使其可靠,您必须:

  • 一次只插入一条记录
  • 指定序列名称;及
  • 在同一会话上执行后续查询,可以使用会话级连接池,也可以使用事务级池,并在同一事务中执行insert和
    lastInsertId
PDO最好使用
INSERT。。。返回
,并从结果集中获取插入的ID。这样,当您执行以下操作时,您将获得一个正常的值:

INSERT INTO mytable(col1,col2)
VALUES (1,'a'),  (2,'b'),  (3,'c')
RETURNING id;
使用
lastInsertId
您将只获得插入的最后一行的ID,并且您不能假设前面的行具有连续的ID。如果
lastInsertId
42
,则不能保证前面的行是
41
40
,因为可能同时存在声明ID的插入


所以“is
lastInsertId
safe”的答案是。。。有点。如果在正确使用
currval
所需的约束条件下使用,它是安全的,但这远远不够理想。就我个人而言,我会避免使用它,并使用
INSERT。。。返回

我可以看到它们在插入时如何保持一致性,但不清楚这是否适用于其他任何情况(例如在我的应用程序中,而不是在数据库中,查找插入的内容)。你确定这样行吗?即使我用的是游泳池?(pgbouncer)再说一遍:如果它不工作,它就根本不存在。求你了,不要把你自己看成是唯一了解这个问题的人。有1000名开发人员正在使用此功能。再说一次:你知道它有效吗,或者你只是使用了“你的常识”,并假设由于有很多人使用它,所以一切正常?我可以看到他们在插入时如何保持一致性,但不清楚这是否适用于其他任何东西(比如在我的应用程序中,而不是在数据库中,找出插入了什么)。你确定这可以正常工作吗?即使我使用的是池?(pgbouncer)再次:如果它不起作用,它将根本不存在。请不要认为你自己是唯一一个了解这个问题的人。有1000多个开发人员正在使用这个功能。再次:你知道它有效吗,或者你只是使用“你的常识”,并假设一切正常,因为有很多人使用它?“每个连接”。如果我正在使用一个池怎么办?(pgbouncer)您从池中获得一个连接,并且只使用该连接。“每个连接”。如果我正在使用一个池怎么办?(pgbouncer)你从池中获得一个连接,并且只使用该连接。哇,这是一个答案!因此,在我的例子中,当使用事务级池时,我必须小心。我不能真正使用lastInsertId()虽然没有$seqname,但不知道为什么,所以我不会上当。谢谢!我考虑过使用
返回
,但是插入语法很烦人,因为我必须一个字段一个字段地指定。我现在将坚持使用lastInsertId。哇,这是一个答案!所以在我的例子中,当使用事务级池时,我必须小心l在那里。如果没有$seqname,我真的无法使用lastInsertId(),但我不知道为什么,所以我不会爱上它。谢谢!我曾考虑过使用
返回
,但插入语法很烦人,因为我必须逐个字段指定。现在我将坚持使用lastInsertId。