8

我有如下查询:

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

然后当我这样做时:

$insert_id = $a->lastInsertId()

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

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

谢谢。

4

2 回答 2

21

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

首先,确保添加id=LAST_INSERT_ID(id)到子句中,如DOCSON DUPLICATE底部所述。在这种情况下,是您的主键的列名(因此在您的情况下,它可能/可能不是标题)。idid

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

于 2013-03-12T22:22:01.290 回答
2

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

于 2013-03-12T22:21:57.913 回答