我有一个如下的查询:
$a = $members->prepare("insert into a(name) values(:name)
on duplicate key update name = :name");
当我这么做的时候:$insert_id = $a->lastInsertId()
如果查询成功地插入了一行,它将返回预期的插入id,如果它更新了一行,它也将返回预期的更新行id(差不多),但是如果因为一切都是一样的,它既没有插入也没有更新任何东西,那么它只返回0。
我想这是非常合乎逻辑的默认行为,但是有没有办法改变它,以便它可以返回它试图更新的行的id,就像它实际上改变了行中的某些内容一样。
谢谢。
3条答案
按热度按时间osh3o9ms1#
有很多地方可以找到这个问题的答案,但是PDO的特异性可能会阻碍你的搜索结果...
首先,确保将
id=LAST_INSERT_ID(id)
添加到ON DUPLICATE
子句中,如the DOCS底部所示,这里的id
是主键的列名(因此在您的情况下,它的标题可能是id
,也可能不是)。此外,您可能需要为
->lastInsertId()
指定一个序列对象参数才能使其工作,我以前在某些情况下遇到过这个问题。pxy2qtax2#
否,因为没有它“尝试”更新的行。另外,请注意:如果在同一会话中在此之前插入了另一个查询,则可以从上一个查询中获得
LAST_INSERT_ID()
值。7tofc5zh3#
下面是一段代码来补充已接受的答案,使用
LAST_INSERT_ID(id)
就可以达到目的,将PDO::lastInsertId()
返回的值设置为更新行的值。它返回预期的
1211
。