文件首頁
MySQL 8.4 C API 開發人員指南
下載本手冊
PDF (美式信紙) - 1.4Mb
PDF (A4) - 1.4Mb


5.4.42 mysql_insert_id()

uint64_t
mysql_insert_id(MYSQL *mysql)

描述

傳回先前 INSERTUPDATE 陳述式為 AUTO_INCREMENT 欄產生的值。在您執行將資料插入含有 AUTO_INCREMENT 欄的資料表,或是使用 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() 在執行產生 AUTO_INCREMENT 值的預存程序之 CALL 陳述式後,會回傳 0,因為在此情況下,mysql_insert_id() 適用於 CALL,而非程序內的陳述式。在程序內,您可以使用 SQL 層級的 LAST_INSERT_ID() 來取得 AUTO_INCREMENT 值。

LAST_INSERT_ID()mysql_insert_id() 之間差異的原因是,LAST_INSERT_ID() 方便在腳本中使用,而 mysql_insert_id() 則試圖提供關於 AUTO_INCREMENT 資料行所發生情況的更精確資訊。

注意

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

回傳值

如前面的討論中所述。

錯誤

  • ER_AUTO_INCREMENT_CONFLICT

    在多個 INSERT 陳述式中,使用者指定的 AUTO_INCREMENT 值落在目前的 AUTO_INCREMENT 值與目前的 AUTO_INCREMENT 值和受影響列數之總和的範圍內。