我收到了如下查询:
$a = $members->prepare("insert into a(name) values(:name)
on duplicate key update name = :name");
然后当我这样做时:
$insert_id = $a->lastInsertId()
如果查询成功插入了一行,它将按预期返回插入ID,如果更新了一行,它还将按预期返回更新的行ID(排序)。但如果它既没有插入或更新任何东西,因为一切都是相同的,那么它只返回0.
我想这是非常合乎逻辑的默认行为,但有没有办法可以更改它,以便它可以返回它尝试更新的行的id,就像它实际更改行中的某些内容时一样。
感谢。
答案 0 :(得分:20)
有很多地方可以找到答案,但PDO的特异性可能会妨碍您的搜索结果......
首先,请务必将id=LAST_INSERT_ID(id)
添加到ON DUPLICATE
子句中,如the DOCS底部所述。在这种情况下,id
是主键的列名称(因此在您的情况下,它可能/可能不会标题为id
)。
此外,您可能必须为->lastInsertId()
指定序列对象参数才能使其正常工作。我之前在某些情况下遇到过这个问题。
答案 1 :(得分:2)
不,因为没有行'尝试'更新。另外,请注意:如果在同一会话中之前有另一个插入查询,则可以从上一个查询中获得LAST_INSERT_ID()
的值。