[英]Reliability of computing insert ids of a multi-row insert statement
我在一條語句中進行多次插入,例如:
INSERT INTO table (foo) VALUES ('aaa'), ('bbb'), ('ccc')
當我嘗試獲取最后一個插入 ID 時,MySQL (PDO) 僅提供第一個插入 ID。
因為我知道我插入了多少項目(上面示例中的三個項目),只要INSERT
作為事務完成,手動計算插入的 ids 是否可靠?
例如,如果 MySQL 返回的第一個插入 ID 是5
,我可以安全地假設上述INSERT
示例的插入 ID 是5
、 6
、 7
嗎? 或者,如果另一個用戶同時插入,是否仍然存在重疊的可能性,即使它們是作為事務完成的?
建議的重復問題雖然相似,但沒有明確回答我的問題。 那里接受的答案只說只給出第一個插入 id 是預期的行為,我同意,但我的問題是關於手動計算方法的可靠性。 那里的評論部分也看起來很有趣。
MySQL 的 JDBC 連接器的代碼依賴於 id 的批次是連續的。
MySQL 協議只返回生成的第一個 id。 但是 JDBC 接口要求連接器實現一個返回所有生成的 id 的方法。 所以它必須假設第一個后面的 id 是連續值。
但每條規則都有例外。
如果您執行“混合模式”的 INSERT,則該假設無效。 這意味着您執行多行 INSERT,其中一些行指定一個值,但其他行期望生成一個新的 id。
如果執行“混合模式”或“批量”插入(后者類似於 INSERT...SELECT 或 LOAD DATA,或行數事先未知的任何其他時間),並且innodb_autoinc_lock_mode=2
(“交錯”)並且在另一個 session 中存在任何類型的並發 INSERT,那么您的 INSERT 的 id 集可能不是連續的。
要了解有關這些問題的更多詳細信息,請仔細閱讀https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html 。
我寧願不做假設。
我插入多行然后立即需要它們的 id 的主要地方是在“規范化”一堆值以便我可以改用 id 時。
這樣做時:
INSERT...SELECT DISTINCT...
將它們放入 id:name 查找表UPDATE.. JOIN.. SET temp.id = norm.id WHERE temp.name = norm.name
。它高效,多線程安全等更多細節: http://mysql.rjweb.org/doc.php/staging_table#normalization
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.