文件首頁
MySQL 9.0 C API 開發人員指南
下載本手冊
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


5.4.42 mysql_insert_id()

uint64_t
mysql_insert_id(MYSQL *mysql)

描述

傳回前一個 INSERTUPDATE 語句為 AUTO_INCREMENT 欄位所產生之值。在執行將資料插入含有 AUTO_INCREMENT 欄位的資料表之 INSERT 語句後,或使用 INSERTUPDATE 設定欄位值時使用 LAST_INSERT_ID(expr) 時,可以使用此函式。

除非在下列其中一個情況下明確更新,否則 mysql_insert_id() 的傳回值永遠為零

mysql_insert_id() 的傳回值可以簡化為下列順序

  1. 如果存在 AUTO_INCREMENT 欄位,且成功插入自動產生值,則傳回第一個此類值。

  2. 如果語句中出現 LAST_INSERT_ID(expr),則傳回 expr,即使受影響的資料表中存在 AUTO_INCREMENT 欄位也一樣。

  3. 傳回值會因使用的語句而異。在 INSERT 語句之後呼叫時

    • 如果資料表中存在 AUTO_INCREMENT 欄位,且有一些明確的值已成功插入資料表中,則傳回最後一個明確的值。

    INSERT ... ON DUPLICATE KEY UPDATE 語句之後呼叫時

    • 如果資料表中存在 AUTO_INCREMENT 欄位,且有一些明確的成功插入值或一些更新值,則傳回最後一個插入或更新的值。

如果先前的語句未使用 AUTO_INCREMENT 值,則 mysql_insert_id() 會傳回 0。如果您必須稍後儲存該值,請務必在產生值的語句之後立即呼叫 mysql_insert_id()

mysql_insert_id() 的值只會受到目前客戶端連線中發出的語句影響。它不受其他客戶端發出之語句的影響。

LAST_INSERT_ID() SQL 函式將包含第一個成功插入的自動產生值。LAST_INSERT_ID() 不會在語句之間重設,因為該函式的值會維護在伺服器中。mysql_insert_id() 的另一個不同之處是,如果您將 AUTO_INCREMENT 欄位設定為特定的非特殊值,則不會更新 LAST_INSERT_ID()。請參閱資訊函式

因為 mysql_insert_id() 在此案例中適用於 CALL 而非程序內的語句,所以在產生 AUTO_INCREMENT 值的預存程序之 CALL 語句之後,mysql_insert_id() 會傳回 0。在程序中,您可以在 SQL 層級使用 LAST_INSERT_ID() 來取得 AUTO_INCREMENT 值。

LAST_INSERT_ID()mysql_insert_id() 之間差異的原因是,LAST_INSERT_ID() 可以輕易地在指令碼中使用,而 mysql_insert_id() 則嘗試提供關於 AUTO_INCREMENT 欄位發生情況的更精確資訊。

注意

客戶端/伺服器協定中使用的 OK 資料包包含例如用於追蹤工作階段狀態的資訊。當客戶端讀取 OK 資料包以了解是否有工作階段狀態變更時,這會重設諸如最後插入 ID 和受影響的列數等值。此類變更會導致在執行包括但不一定限於 COM_PINGCOM_REFRESHCOM_INIT_DB 等命令之後,mysql_insert_id() 傳回 0。

傳回值

如先前的討論中所述。

錯誤

  • ER_AUTO_INCREMENT_CONFLICT

    多重 INSERT 語句中使用者指定的 AUTO_INCREMENT 值落在目前 AUTO_INCREMENT 值與目前值加上受影響列數總和的範圍之間。