PDO lastInsertId()在重复密钥更新时使用时返回0?

时间:2013-03-12 22:15:37

标签: php mysql pdo

我收到了如下查询:

$a = $members->prepare("insert into a(name) values(:name) 
                            on duplicate key update name = :name");

然后当我这样做时:

$insert_id = $a->lastInsertId()

如果查询成功插入了一行,它将按预期返回插入ID,如果更新了一行,它还将按预期返回更新的行ID(排序)。但如果它既没有插入或更新任何东西,因为一切都是相同的,那么它只返回0.

我想这是非常合乎逻辑的默认行为,但有没有办法可以更改它,以便它可以返回它尝试更新的行的id,就像它实际更改行中的某些内容时一样。

感谢。

2 个答案:

答案 0 :(得分:20)

有很多地方可以找到答案,但PDO的特异性可能会妨碍您的搜索结果......

首先,请务必将id=LAST_INSERT_ID(id)添加到ON DUPLICATE子句中,如the DOCS底部所述。在这种情况下,id是主键的列名称(因此在您的情况下,它可能/可能不会标题为id)。

此外,您可能必须为->lastInsertId()指定序列对象参数才能使其正常工作。我之前在某些情况下遇到过这个问题。

答案 1 :(得分:2)

不,因为没有行'尝试'更新。另外,请注意:如果在同一会话中之前有另一个插入查询,则可以从上一个查询中获得LAST_INSERT_ID()的值。