2013-03-12 71 views
7

我有类似下面的查询:使用重复键更新时,PDO lastInsertId()返回0?

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

然后,当我这样做:

$insert_id = $a->lastInsertId()

如果查询成功插入一行时,它会返回插入的ID如预期,如果它更新了一行,它也会像预期的那样返回更新的行ID(排序)。但如果它既没有插入也没有更新,因为一切都是一样的,那么它只返回0.

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

谢谢。

回答

16

有很多地方找到这个答案,但特异性PDO可能会阻碍你的搜索结果...

首先,确保添加id=LAST_INSERT_ID(id)ON DUPLICATE条款,如在底部注意的the DOCS。在这种情况下,id是主键的列名称(因此在您的情况下,可能/不可能标题为id)。

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

+0

幸运/不幸的是(取决于你如何看待它),MySQL有只有'AUTO_INCREMENT'序列,因此,除非它有一些非标准扩展,为''MySQL' - > lastInsertId()'不带参数的精细,与'PostreSQL'等相反。 – Wrikken 2013-03-12 22:30:45

2

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