2013-03-12 135 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()的值。