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
值與目前值加上受影響列數總和的範圍之間。