墨墨導讀:MySQL中常用的四種插入數據的語(yǔ)句:insert ,insert select,replace into,insert into on duplicate key update,以下詳述這四種插入數據的語(yǔ)句,希望可以幫助到大家。
INSERT語(yǔ)句是最常見(jiàn)的SQL語(yǔ)句之一,MySQL中INSERT有其他形態(tài)的插入數據方式。下面了解一下MySQL中常用的四種插入數據的語(yǔ)句:
INSERT INTO
1. insert into表示插入數據,數據庫會(huì )檢查主鍵(PrimaryKey),如果出現重復會(huì )報錯;除了這個(gè)之外還有一些配合的參數。
語(yǔ)法如下:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_name [, partition_name] ...)] [(col_name [, col_name] ...)] {VALUES | VALUE} (value_list) [, (value_list)] ... [ON DUPLICATE KEY UPDATE assignment_list]DELAYED:
是立刻返回一個(gè)標識,告訴上層程序,數據已經(jīng)插入了,當表沒(méi)有被其它線(xiàn)程使用時(shí),此行被插入,真實(shí)插入時(shí)間就不可控了。所以這樣的寫(xiě)法對數據的安全性是沒(méi)有保障的。
延遲插入和替換在MySQL 5.6中是不推薦的。在MySQL 5.7,MySQL 8.0中,不支持延遲。服務(wù)器識別但忽略DELAYED關(guān)鍵字,將插入處理為非延遲插入,并生成er_warn_legacy_syntax_convert警告(“不再支持延遲插入”)。語(yǔ)句被轉換為INSERT”)。DELAYED關(guān)鍵字計劃在未來(lái)的版本中刪除。
LOW_PRIORITY:
插入的執行將被延遲,直到?jīng)]有其他客戶(hù)端從表中讀取數據。這包括在現有客戶(hù)端正在讀取時(shí)以及INSERT LOW_PRIORITY語(yǔ)句正在等待時(shí)開(kāi)始讀取的其他客戶(hù)端。因此,對于發(fā)出INSERT LOW_PRIORITY語(yǔ)句的客戶(hù)機,可能要等待很長(cháng)時(shí)間。
LOW_PRIORITY只影響只使用表級鎖的存儲引擎(如MyISAM、內存和合并)。
LOW_PRIORITY通常不應該用于MyISAM表,因為這樣做會(huì )禁用并發(fā)插入
HIGH_PRIORITY:
如果指定了HIGH_PRIORITY,同時(shí)服務(wù)器采用–low-priority-updates選項啟動(dòng),則HIGH_PRIORITY將覆蓋–low-priority-updates選項。這么做還會(huì )導 致同時(shí)進(jìn)行的插入被取消。
【 low_priority_updates:如果設置為1,所有插入、更新、刪除和鎖表寫(xiě)語(yǔ)句都將等待,直到受影響的表上沒(méi)有未決的選擇或鎖表讀取。使用{INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY…僅降低一個(gè)查詢(xún)的優(yōu)先級。這個(gè)變量只影響只使用表級鎖的存儲引擎(如MyISAM、MEMORY和MERGE)MySQL的merge引擎類(lèi)型允許把許多結構相同的表合并為一個(gè)表,Merge表有點(diǎn)類(lèi)似于視圖?!?/span>
IGNORE:
insert ignore表示,如果中已經(jīng)存在相同的記錄,則忽略當前新數據,主鍵和唯一鍵為基準;
mysql> insert ignore tinsert(id,name) values(3,'D');Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> show warnings;+---------+------+---------------------------------------+| Level | Code | Message |+---------+------+---------------------------------------+| Warning | 1062 | Duplicate entry '3' for key 'PRIMARY' |+---------+------+---------------------------------------+INSERT INTO SELECT
把一張表的字段數據導入到另一張表中,執行語(yǔ)句會(huì )把整個(gè)數據會(huì )打包成一個(gè)事務(wù)執行。
注意:當從同一個(gè)表中選擇和插入時(shí),MySQL創(chuàng )建一個(gè)內部臨時(shí)表來(lái)保存SELECT中的行,然后將這些行插入到目標表中。但是,不能使用INSERT INTO t…選擇……當t是臨時(shí)表時(shí),從t開(kāi)始,因為臨時(shí)表不能在同一語(yǔ)句中被引用兩次。
REPLACE INTO
replace into 跟 insert 功能類(lèi)似,不同點(diǎn)在于:replace into 首先嘗試插入數據到表中,
1. 如果發(fā)現表中已經(jīng)有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據。
2. 否則,直接插入新數據。
3. REPLACE,您必須同時(shí)擁有表的INSERT,UPDATE,DELETE權限。
語(yǔ)法:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [PARTITION (partition_name [, partition_name] ...)] [(col_name [, col_name] ...)] {VALUES | VALUE} (value_list) [, (value_list)] ...注意:插入數據的表必須有主鍵或者是唯一索引!否則的話(huà),replace into 會(huì )直接插入數據,這將導致表中出現重復的數據。
1. 下面看看binlog 解析:主鍵和唯一鍵同事存在的時(shí)候語(yǔ)句不一樣。
主鍵:是進(jìn)行update操作。
主鍵+唯一鍵:delete+insert操作。
2. 但對于同一個(gè)數據所有行都一樣的時(shí)候replace into就不會(huì )進(jìn)行更新操作。
INSERT INTO ON DUMPLICATE KEY UPDATE
ON DUPLICATE KEY UPDATE語(yǔ)句,并且要插入的行將導致惟一索引或主鍵中出現重復值,則會(huì )對舊行進(jìn)行更新。但主鍵和唯一鍵同事存在的時(shí)候,選擇主鍵。
實(shí)際驗證流程如下:
總結
從基本Insert延伸到另外3種方式,理解了其用法,非常重要的。通過(guò)了解,可以在實(shí)際環(huán)境中有效的利用起來(lái),要是盲目的投入使用,就會(huì )存在性能問(wèn)題。
1. 在實(shí)際sysbench壓測中,硬件配置比較好的情況,混合&插入模式下 MySQL的單臺TPS能到 1w~6w的性能。insert也是有極限的,超過(guò)這個(gè)范圍的時(shí)候,會(huì )存在延遲等性能瓶頸。
2. REPLACE INTO性能中 delete insert索引頁(yè)分裂可能非常嚴重。需要注意
3. INSERT ON DUPLICATE KEY UPDATE如果一個(gè)表定義有多個(gè)唯一鍵或 主鍵同時(shí)存在時(shí),是不安全的,這會(huì )引發(fā)操作錯誤,導致數據處理錯誤。
4. INSERT SELECT是 表之間遷移數據的很好的方式,但需要用帶索引的字段進(jìn)行條件和排序限制。除此之外數據量多的時(shí)候,可以理解成一個(gè)大事務(wù)。
墨天輪原文鏈接:https://www.modb.pro/db/28662(復制到瀏覽器中打開(kāi)或者點(diǎn)擊“閱讀原文”)
聯(lián)系客服