如何插入? | 非開車,純技術交流

今天系統性講講,什麼是插入,如何插入。程序員

MySQL有一系列的語句,能夠往數據庫新增數據,稱做範插入語句(insert-like statement)。不一樣的插入方式,對自增鍵的影響是不同的。
畫外音:自增鍵,是指auto_increment,你們應該都用得不少。面試

更爲細化後,總的來講,插入方式分爲三類:數據庫

  • 簡單插入(simple insert)
  • 批量插入(bulk insert)
  • 混合插入(mixed-mode insert)

什麼是簡單插入(simple insert)?
普通的insert/replace語句,無論是單條插入仍是多條插入,都是簡單插入。
*畫外音:
(1)不包含遞歸的子查詢;
(2)不包含insert … on duplicate key update… ;*架構

如《自增鍵測試》裏的實驗一:
insert into t1(id, name) values(1,"shenjian");
insert into t1(name) values("zhangsan"),("lisi"),("ww");
都是簡單插入。併發

簡單插入的特色是,可以提早知道被插入的行數。學習

所以,這類插入,在處理自增鍵時,是最容易的。
畫外音:很容易保證自增鍵連續性。測試

什麼是批量插入(bulk insert)?
與簡單插入相對,在插入時,不知道被插入的行數,是批量插入。code

如《自增鍵測試》裏的實驗二:
insert into t1(name) select name from t2;遞歸

除此以外,像:事務

  • replace … select …
  • load data

都是批量插入。

因爲不可以提早知道多少行插入,在處理自增列時,每插入一行,纔會賦值新的自增值。
*畫外音,官網原文是:
InnoDB assigns new values for the AUTOINCREMENT column one at a time as each row is processed.*

這裏的潛臺詞是,在批量插入事務併發時,「可能」出現同一個事務的自增鍵不連續。
畫外音:爲啥是「可能」呢?潛在解決方案,將來撰文詳述。

什麼是混合插入(mixed-mode insert)?
如《自增鍵測試》裏的實驗三:
insert into t1(id, name) values (111,"111"),(NULL, "abc"),(222,"222"),(NULL,"xyz");

有些行插入時指定了自增鍵,無需數據庫生成;
有些行插入時未指定自增鍵(NULL),須要數據庫生成。
畫外音:具體走哪一個分支,實際執行時才知道。

以及《自增鍵測試》裏實驗四:
insert into t1(name) values("shenjian"),("aaa"),("bbb")
on duplicate key update count=100;

有些行插入其實是修改,無需數據庫生成自增鍵;
有些行插入實際上就是插入,須要數據庫生成自增鍵。
畫外音:具體走哪一個分支,也是實際執行時才知道。

insert … on duplicate key update … 這種狀況是最最複雜的,它可能致使,系統生成的自增值,在更新階段用不上。
*畫外音,官網原文是:
an INSERT followed by a UPDATE, where the allocated value for the AUTOINCREMENT column may or may not be used during the update phase.*

在這裏,能有機會系統性思考,以前沒有想過的問題。
畫外音:固然,我只能分享和引導,收穫有多大,得看大夥細節扣得多深。就像昨天和今天的兩篇,「自增鍵」和「插入」誰都會用,但真的思考過這些「coding時用不到」的看似無用的知識麼。

今天就分享這麼多,歡迎各位朋友在留言區評論,對於有價值的留言,我都會一一回復的。若是以爲文章對你有一丟丟幫助,請給我點個贊吧,讓更多人看到該文章。
另外,小編最近將收集的Java程序員進階架構師和麪試的資料作了一些整理,免費分享給每一位學習Java的朋友,一個能夠互相學習,一塊兒嗨皮的圈子,交流羣:751827870,
歡迎你們進羣和我一塊兒交流,一塊兒嗨皮。

________________end__________________
相關文章
相關標籤/搜索