如何插入? | 非开车,纯技术交流
MySQL有一系列的語句,可以往數(shù)據(jù)庫新增數(shù)據(jù),稱作范插入語句(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");都是簡單插入。
?
簡單插入的特點是,能夠提前知道被插入的行數(shù)。
?
因此,這類插入,在處理自增鍵時,是最容易的。
畫外音:很容易保證自增鍵連續(xù)性。
?
什么是批量插入(bulk insert)?
與簡單插入相對,在插入時,不知道被插入的行數(shù),是批量插入。
?
如
insert into t1(name) select name from t2;?
除此之外,像:
replace … select …
load data
都是批量插入。
?
由于不能夠提前知道多少行插入,在處理自增列時,每插入一行,才會賦值新的自增值。
畫外音,官網(wǎng)原文是:
InnoDB assigns new values for the AUTO_INCREMENT column one at a time as each row is processed.
?
這里的潛臺詞是,在批量插入事務并發(fā)時,“可能”出現(xiàn)同一個事務的自增鍵不連續(xù)。
畫外音:為啥是“可能”呢?潛在解決方案,未來撰文詳述。
?
什么是混合插入(mixed-mode insert)?
如
insert into t1(id, name) values?(111,"111"),(NULL,?"abc"),(222,"222"),(NULL,"xyz");?
有些行插入時指定了自增鍵,無需數(shù)據(jù)庫生成;
有些行插入時未指定自增鍵(NULL),需要數(shù)據(jù)庫生成。
畫外音:具體走哪個分支,實際執(zhí)行時才知道。
?
以及
insert into t1(name) values("shenjian"),("aaa"),("bbb") on duplicate key update count=100;?
有些行插入實際上是修改,無需數(shù)據(jù)庫生成自增鍵;
有些行插入實際上就是插入,需要數(shù)據(jù)庫生成自增鍵。
畫外音:具體走哪個分支,也是實際執(zhí)行時才知道。
?
insert … on duplicate key update … 這種情況是最最復雜的,它可能導致,系統(tǒng)生成的自增值,在更新階段用不上。
畫外音,官網(wǎng)原文是:
an INSERT followed by a UPDATE, where the allocated value for the AUTO_INCREMENT column may or may not be used during the update phase.?
最后,再挖兩個坑,大伙想想。
?
作業(yè)題一:
insert into t1(name)values("zhangsan"),("lisi"),("wangwu");
這類簡單插入,當有并發(fā)事務執(zhí)行時,自增鍵仍能保證連續(xù)性,是如何做到的?
A: 行粒度加鎖,實施互斥
B: 表粒度加鎖,實施互斥
C: 全局自增鍵單例,實施互斥
D: SQL語句粒度加鎖,實施互斥
E: 事務粒度加鎖,實施互斥
?
作業(yè)題二:
基于SQL復制的主從同步,如果執(zhí)行并發(fā)批量插入(bulk insert)事務,“可能”出現(xiàn)同一個事務的自增鍵不連續(xù),那么能否保證主從數(shù)據(jù)的一致性?如果能,是怎么保證的?
?
- MORE | 更多精彩文章 -
沒想到,遠程工作的時代竟然這么到來了
作為阿里的面試官,我有話想說。
互聯(lián)網(wǎng)公司為啥都不用MySQL分區(qū)表?
微服務架構(gòu)的四大金剛利器
如果你喜歡本文,
請長按二維碼,關注?Hollis.
轉(zhuǎn)發(fā)至朋友圈,是對我最大的支持。
好文章,我在看??
總結(jié)
以上是生活随笔為你收集整理的如何插入? | 非开车,纯技术交流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程不仅是写代码!?
- 下一篇: NoSuchMethodError 常见