INSERT語(yǔ)句是最常見的SQL語(yǔ)句之一,MySQL中INSERT有其他形態(tài)的插入數(shù)據(jù)方式。下面了解一下mysql中常用的四種插入數(shù)據(jù)的語(yǔ)句:
INSERT INTO
1.insert into表示插入數(shù)據(jù),數(shù)據(jù)庫(kù)會(huì)檢查主鍵(PrimaryKey),如果出現(xiàn)重復(fù)會(huì)報(bào)錯(cuò);除了這個(gè)之外還有一些配合的參數(shù).
語(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è)標(biāo)識(shí),告訴上層程序,數(shù)據(jù)已經(jīng)插入了,當(dāng)表沒(méi)有被其它線程使用時(shí),此行被插入,真實(shí)插入時(shí)間就不可控了。所以這樣的寫法對(duì)數(shù)據(jù)的安全性是沒(méi)有保障的。 延遲插入和替換在MySQL 5.6中是不推薦的。在MySQL 5.7,MySQL 8.0中,不支持延遲。服務(wù)器識(shí)別但忽略DELAYED關(guān)鍵字,將插入處理為非延遲插入,并生成erwarnlegacysyntaxconvert警告(“不再支持延遲插入”)。語(yǔ)句被轉(zhuǎn)換為INSERT”)。DELAYED關(guān)鍵字計(jì)劃在未來(lái)的版本中刪除。
- LOW_PRIORITY:插入的執(zhí)行將被延遲,直到?jīng)]有其他客戶端從表中讀取數(shù)據(jù)。這包括在現(xiàn)有客戶端正在讀取時(shí)以及INSERT LOWPRIORITY語(yǔ)句正在等待時(shí)開始讀取的其他客戶端。因此,對(duì)于發(fā)出INSERT LOWPRIORITY語(yǔ)句的客戶機(jī),可能要等待很長(zhǎng)時(shí)間。 LOWPRIORITY只影響只使用表級(jí)鎖的存儲(chǔ)引擎(如MyISAM、內(nèi)存和合并)。 LOWPRIORITY通常不應(yīng)該用于MyISAM表,因?yàn)檫@樣做會(huì)禁用并發(fā)插入
- HIGH_PRIORITY:如果指定了HIGHPRIORITY,同時(shí)服務(wù)器采用–low-priority-updates選項(xiàng)啟動(dòng),則HIGHPRIORITY將覆蓋–low-priority-updates選項(xiàng)。這么做還會(huì)導(dǎo) 致同時(shí)進(jìn)行的插入被取消。 【 lowpriorityupdates:如果設(shè)置為1,所有插入、更新、刪除和鎖表寫語(yǔ)句都將等待,直到受影響的表上沒(méi)有未決的選擇或鎖表讀取。使用{INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY…僅降低一個(gè)查詢的優(yōu)先級(jí)。這個(gè)變量只影響只使用表級(jí)鎖的存儲(chǔ)引擎(如MyISAM、MEMORY和MERGE)mysql的merge引擎類型允許把許多結(jié)構(gòu)相同的表合并為一個(gè)表,Merge表有點(diǎn)類似于視圖。】
- IGNORE:insert ignore表示,如果中已經(jīng)存在相同的記錄,則忽略當(dāng)前新數(shù)據(jù),主鍵和唯一鍵為基準(zhǔn);
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
把一張表的字段數(shù)據(jù)導(dǎo)入到另一張表中,執(zhí)行語(yǔ)句會(huì)把整個(gè)數(shù)據(jù)會(huì)打包成一個(gè)事務(wù)執(zhí)行。

注意:當(dāng)從同一個(gè)表中選擇和插入時(shí),MySQL創(chuàng)建一個(gè)內(nèi)部臨時(shí)表來(lái)保存SELECT中的行,然后將這些行插入到目標(biāo)表中。但是,不能使用INSERT INTO t…選擇……當(dāng)t是臨時(shí)表時(shí),從t開始,因?yàn)榕R時(shí)表不能在同一語(yǔ)句中被引用兩次
REPLACE INTO
replace into 跟 insert 功能類似,不同點(diǎn)在于:replace into 首先嘗試插入數(shù)據(jù)到表中,
- 如果發(fā)現(xiàn)表中已經(jīng)有此行數(shù)據(jù)(根據(jù)主鍵或者唯一索引判斷)則先刪除此行數(shù)據(jù),然后插入新的數(shù)據(jù);
- 否則,直接插入新數(shù)據(jù);
- REPLACE,您必須同時(shí)擁有表的INSERT,UPDATE,DELETE權(quán)限。
語(yǔ)法:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
注意:插入數(shù)據(jù)的表必須有主鍵或者是唯一索引!否則的話,replace into 會(huì)直接插入數(shù)據(jù),這將導(dǎo)致表中出現(xiàn)重復(fù)的數(shù)據(jù)。
1.下面看看binlog 解析:主鍵和唯一鍵同事存在的時(shí)候語(yǔ)句不一樣。
主鍵:是進(jìn)行update操作。
主鍵+唯一鍵:delete+insert操作

2.但對(duì)于同一個(gè)數(shù)據(jù)所有行都一樣的時(shí)候replace into就不會(huì)進(jìn)行更新操作。
INSERT INTO ON DUMPLICATE KEY UPDATE
...
? 接下來(lái)內(nèi)容請(qǐng)?jiān)L問(wèn)原文(https://www.modb.pro/db/28662?YYF)進(jìn)行查看~
更多數(shù)據(jù)庫(kù)相關(guān)內(nèi)容,可訪問(wèn)墨天輪(https://www.modb.pro/?YYF)進(jìn)行瀏覽。
