uint64_t
mysql_insert_id(MYSQL *mysql)
傳回先前 INSERT
或 UPDATE
陳述式為 AUTO_INCREMENT
欄產生的值。在您執行將資料插入含有 AUTO_INCREMENT
欄的資料表,或是使用 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
。透過將
LAST_INSERT_ID(
插入任何欄,或將任何欄更新為expr
)LAST_INSERT_ID(
,產生expr
)AUTO_INCREMENT
值的INSERT
陳述式。如果先前的陳述式傳回錯誤,則
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()
在執行產生 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_PING
、COM_REFRESH
和 COM_INIT_DB
。
-
在多個
INSERT
陳述式中,使用者指定的AUTO_INCREMENT
值落在目前的AUTO_INCREMENT
值與目前的AUTO_INCREMENT
值和受影響列數之總和的範圍內。