簡體   English   中英

計算多行插入語句的插入 ID 的可靠性

[英]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 是567嗎? 或者,如果另一個用戶同時插入,是否仍然存在重疊的可能性,即使它們是作為事務完成的?


建議的重復問題雖然相似,但沒有明確回答我的問題。 那里接受的答案只說只給出第一個插入 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 時。

這樣做時:

  1. 從包含要規范化的字符串的臨時表開始,
  2. 使用INSERT...SELECT DISTINCT...將它們放入 id:name 查找表
  3. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM