INSERT語句是最常見的SQL語句之一,MySQL中INSERT有其他形態的插入數據方式。下面了解一下mysql中常用的四種插入數據的語句:
INSERT INTO
1.insert into表示插入數據,數據庫會檢查主鍵(PrimaryKey),如果出現重復會報錯;除了這個之外還有一些配合的參數.
語法如下:
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:是立刻返回一個標識,告訴上層程序,數據已經插入了,當表沒有被其它線程使用時,此行被插入,真實插入時間就不可控了。所以這樣的寫法對數據的安全性是沒有保障的。 延遲插入和替換在MySQL 5.6中是不推薦的。在MySQL 5.7,MySQL 8.0中,不支持延遲。服務器識別但忽略DELAYED關鍵字,將插入處理為非延遲插入,并生成erwarnlegacysyntaxconvert警告(“不再支持延遲插入”)。語句被轉換為INSERT”)。DELAYED關鍵字計劃在未來的版本中刪除。
- LOW_PRIORITY:插入的執行將被延遲,直到沒有其他客戶端從表中讀取數據。這包括在現有客戶端正在讀取時以及INSERT LOWPRIORITY語句正在等待時開始讀取的其他客戶端。因此,對于發出INSERT LOWPRIORITY語句的客戶機,可能要等待很長時間。 LOWPRIORITY只影響只使用表級鎖的存儲引擎(如MyISAM、內存和合并)。 LOWPRIORITY通常不應該用于MyISAM表,因為這樣做會禁用并發插入
- HIGH_PRIORITY:如果指定了HIGHPRIORITY,同時服務器采用–low-priority-updates選項啟動,則HIGHPRIORITY將覆蓋–low-priority-updates選項。這么做還會導 致同時進行的插入被取消。 【 lowpriorityupdates:如果設置為1,所有插入、更新、刪除和鎖表寫語句都將等待,直到受影響的表上沒有未決的選擇或鎖表讀取。使用{INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY…僅降低一個查詢的優先級。這個變量只影響只使用表級鎖的存儲引擎(如MyISAM、MEMORY和MERGE)mysql的merge引擎類型允許把許多結構相同的表合并為一個表,Merge表有點類似于視圖。】
- IGNORE:insert ignore表示,如果中已經存在相同的記錄,則忽略當前新數據,主鍵和唯一鍵為基準;
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
把一張表的字段數據導入到另一張表中,執行語句會把整個數據會打包成一個事務執行。
注意:當從同一個表中選擇和插入時,MySQL創建一個內部臨時表來保存SELECT中的行,然后將這些行插入到目標表中。但是,不能使用INSERT INTO t…選擇……當t是臨時表時,從t開始,因為臨時表不能在同一語句中被引用兩次
REPLACE INTO
replace into 跟 insert 功能類似,不同點在于:replace into 首先嘗試插入數據到表中,
- 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據;
- 否則,直接插入新數據;
- REPLACE,您必須同時擁有表的INSERT,UPDATE,DELETE權限。
語法:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
注意:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入數據,這將導致表中出現重復的數據。
1.下面看看binlog 解析:主鍵和唯一鍵同事存在的時候語句不一樣。
主鍵:是進行update操作。
主鍵+唯一鍵:delete+insert操作
2.但對于同一個數據所有行都一樣的時候replace into就不會進行更新操作。
INSERT INTO ON DUMPLICATE KEY UPDATE
...
? 接下來內容請訪問原文(https://www.modb.pro/db/28662?YYF)進行查看~
更多數據庫相關內容,可訪問墨天輪(https://www.modb.pro/?YYF)進行瀏覽。