2016-08-18 111 views
0

我有關於MySQL的bluk插入忽略陳述了幾個問題,無論是InnoDB和MyISAM.An例如:MySQL的批量插入忽略

INSERT IGNORE INTO table(`reference`) VALUES ('1','2','3') 

參考是一個獨特的鍵也。

  1. 是一個批量插入原子嗎?所以,如果我把這個發送到數據庫,我可以放心,在這個聲明之間沒有其他插入發生?

  2. 批量插入返回插入批次的第一個ID的值。但是,如果第一次插入恰好是重複發生的事情(我會得到一個0作爲返回值,或者是下一個(插入成功返回,我不能在這個文檔中找到)

類問候,

回答

2

很多事情會在這裏...

  • 語法錯誤:你有1列,但3倍的值。也許你的意思是呢? ... VALUES (1), (2), (3)
  • 修復之後,您的一條語句本質上等同於包含在事務中的三個1行INSERT IGNOREs(如果使用InnoDB)。
  • 由於IGNORE,任何重複鍵不會中止插入。
  • VARIABLE innodb_autoinc_lock_mode控制AUTO_INCREMENT在多行INSERT期間發生的情況。需要知道它的價值才能完全回答這個問題。默認情況下,AUTO_INCREMENT id將被提升3,無論有多少reference值是重複的。這導致了令人驚訝的「燃燒」ID。 (並且消除了關於什麼是「第一個ID」的問題。)
  • 在非事務引擎(如MyISAM)中,沒有什麼是「原子」的。特別是,...
  • 使用MyISAM,多行寫入(插入/更新/刪除)被中斷(例如,由於電源故障),可能已經完成了一些行 - 您無法分辨出多少行。 (這是避免MyISAM的重要原因。)
0

一個單一的MySQL查詢,無論是SELECTINSERT或其他任何東西,應該是原子,只要該語句要麼完全成功,並完成或失敗並回滾。這並不意味着你的INSERT將運行或者它將完全符合ACID標準,但應該是原子的。

A batch insert returns the value of the First ID inserted of the batch.

我不知道你用的是什麼工具或接口,但documentation否則說:

If you use an INSERT ... VALUES statement with multiple value lists or INSERT ... SELECT, the statement returns an information string in this format:

Records: 100 Duplicates: 0 Warnings: 0

在JDBC,例如,API返回的受INSERT操作記錄的數量,而不是插入第一行的ID。