uint64_t
mysql_insert_id(MYSQL *mysql)
傳回前一個 INSERT 或 UPDATE 語句為 AUTO_INCREMENT 欄位所產生之值。在執行將資料插入含有 AUTO_INCREMENT 欄位的資料表之 INSERT 語句後,或使用 INSERT 或 UPDATE 設定欄位值時使用 LAST_INSERT_ID( 時,可以使用此函式。expr)
除非在下列其中一個情況下明確更新,否則 mysql_insert_id() 的傳回值永遠為零
將值儲存到
AUTO_INCREMENT欄位的INSERT語句。無論該值是透過將特殊值NULL或0儲存到欄位中自動產生,或是明確的非特殊值,都是如此。-
在多列
INSERT語句的情況下,mysql_insert_id()會傳回第一個成功插入的自動產生AUTO_INCREMENT值。如果沒有成功插入任何列,
mysql_insert_id()會傳回 0。 如果執行
INSERT ... SELECT語句,且沒有成功插入自動產生值,則mysql_insert_id()會傳回最後插入列的 ID。如果
INSERT ... SELECT語句使用LAST_INSERT_ID(,則expr)mysql_insert_id()會傳回expr。INSERT語句透過將LAST_INSERT_ID(插入任何欄位,或將任何欄位更新為expr)LAST_INSERT_ID(來產生expr)AUTO_INCREMENT值。如果先前的語句傳回錯誤,則
mysql_insert_id()的值未定義。
mysql_insert_id() 的傳回值可以簡化為下列順序
如果存在
AUTO_INCREMENT欄位,且成功插入自動產生值,則傳回第一個此類值。如果語句中出現
LAST_INSERT_ID(,則傳回expr)expr,即使受影響的資料表中存在AUTO_INCREMENT欄位也一樣。-
傳回值會因使用的語句而異。在
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_PING、COM_REFRESH 和 COM_INIT_DB 等命令之後,mysql_insert_id() 傳回 0。
-
多重
INSERT語句中使用者指定的AUTO_INCREMENT值落在目前AUTO_INCREMENT值與目前值加上受影響列數總和的範圍之間。