ON DUPLICATE KEY UPDATE

INSERT INTO ON DUPLICATE KEY UPDATE 與 REPLACE INTO,兩個命令可以處理重復鍵值問題,在實際上它之間有什么區別呢?
前提條件是這個表必須有一個唯一索引或主鍵。

1、REPLACE發現重復的先刪除再插入,如果記錄有多個字段,在插入的時候如果有的字段沒有賦值,那么新插入的記錄這些字段為空。
2、INSERT發現重復的是更新操作。在原有記錄基礎上,更新指定字段內容,其它字段內容保留。

這樣REPLACE的操作成本要大于 insert??ON DUPLICATE KEY UPDATE>.??按照 odds 的 代碼 ,按道理應該選用insert??ON DUPLICATE KEY UPDATE


部分測試如下
2個 都是 影響的數據欄: 2
時間: 0.000ms
mysql insert的幾點操作(DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE )

INSERT語法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

? ?? ? [INTO] tbl_name [(col_name,...)]

? ?? ? VALUES ({expr | DEFAULT},...),(...),...

? ?? ? [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

? ?? ? [INTO] tbl_name

? ?? ? SET col_name={expr | DEFAULT}, ...

? ?? ? [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

或:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

? ?? ? [INTO] tbl_name [(col_name,...)]

? ?? ? SELECT ...

? ?? ? [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]



一、DELAYED 的使用

? ???使用延遲插入操作

DELAYED調節符應用于INSERT和REPLACE語句。當DELAYED插入操作到達的時候,

服務器把數據行放入一個隊列中,并立即給客戶端返回一個狀態信息,這樣客戶

端就可以在數據表被真正地插入記錄之前繼續進行操作了。如果讀取者從該數據

表中讀取數據,隊列中的數據就會被保持著,直到沒有讀取者為止。接著服務器

開始插入延遲數據行(delayed-row)隊列中的數據行。在插入操作的同時,服務器

還要檢查是否有新的讀取請求到達和等待。如果有,延遲數據行隊列就被掛起,

允許讀取者繼續操作。當沒有讀取者的時候,服務器再次開始插入延遲的數據行。

這個過程一直進行,直到隊列空了為止。

幾點要注意事項:

· INSERT DELAYED應該僅用于指定值清單的INSERT語句。服務器忽略用于INSERT DELAYED...SELECT語句的DELAYED。

· 服務器忽略用于INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED。

· 因為在行被插入前,語句立刻返回,所以您不能使用LAST_INSERT_ID()來獲取AUTO_INCREMENT值。AUTO_INCREMENT值可能由語句生成。

· 對于SELECT語句,DELAYED行不可見,直到這些行確實被插入了為止。

· DELAYED在從屬復制服務器中被忽略了,因為DELAYED不會在從屬服務器中產生與主服務器不一樣的數據。

注意,目前在隊列中的各行只保存在存儲器中,直到它們被插入到表中為止。這意味著,如果您強行中止了mysqld(例如,使用kill -9)

或者如果mysqld意外停止,則所有沒有被寫入磁盤的行都會丟失。

二、IGNORE的使用

IGNORE是MySQL相對于標準SQL的擴展。如果在新表中有重復關鍵字,

或者當STRICT模式啟動后出現警告,則使用IGNORE控制ALTER TABLE的運行。

如果沒有指定IGNORE,當重復關鍵字錯誤發生時,復制操作被放棄,返回前一步驟。

如果指定了IGNORE,則對于有重復關鍵字的行,只使用第一行,其它有沖突的行被刪除。

并且,對錯誤值進行修正,使之盡量接近正確值。

insert ignore into tb(...) value(...)

這樣不用校驗是否存在了,有則忽略,無則添加



三、ON DUPLICATE KEY UPDATE的使用

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后會導致在一個UNIQUE索引或PRIMARY KEY中出現重復值,則執行舊行UPDATE。例如,如果列a被定義為UNIQUE,并且包含值1,則以下兩個語句具有相同的效果:

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)



? ?? ? -> ON DUPLICATE KEY UPDATE c=c+1;







mysql> UPDATE table SET c=c+1 WHERE a=1;



如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。



注釋:如果列b也是唯一列,則INSERT與此UPDATE語句相當:



mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;



如果a=1 OR b=2與多個行向匹配,則只有一個行被更新。通常,您應該盡量避免對帶有多個唯一關鍵字的表使用ON DUPLICATE KEY子句。



您可以在UPDATE子句中使用VALUES(col_name)函數從INSERT...UPDATE語句的INSERT部分引用列值。換句話說,如果 沒有發生重復關鍵字沖突,則UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函數特別適用于多行插入。 VALUES()函數只在INSERT...UPDATE語句中有意義,其它時候會返回NULL。



示例:



mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)



? ?? ? -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);



本語句與以下兩個語句作用相同:



mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)



? ?? ? -> ON DUPLICATE KEY UPDATE c=3;



mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)



? ?? ? -> ON DUPLICATE KEY UPDATE c=9;



當您使用ON DUPLICATE KEY UPDATE時,DELAYED選項被忽略。







總結:DELAYED 做為快速插入,并不是很關心失效性,提高插入性能。



? ?? ???ignore? ???只關注主鍵對應記錄是不存在,無則添加,有則忽略。



? ???ON DUPLICATE KEY UPDATE 在添加時操作,關注非主鍵列,注意與ignore的區別。有則更新指定列,無則添加。
posted on 2008-08-22 14:17 魚有所思 閱讀(3997) 評論(1)??編輯 收藏 引用 網摘 所屬分類: MySQL

評論:
# MySQL INSERT ... ON DUPLICATE KEY UPDATE 2008-08-22 14:26 | 魚有所思
INSERT ... ON DUPLICATE KEY UPDATE,當插入的記錄會引發主鍵沖突或者違反唯一約束時,則使用UPDATE更新舊的記錄,否則插入新記錄。

mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid | int(11) | NO | PRI | | |
| uname | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from test;
+-----+--------+
| uid | uname |
+-----+--------+
| 1 | uname1 |
| 2 | uname2 |
| 3 | me |
+-----+--------+
3 rows in set (0.00 sec)

mysql> INSERT INTO test values ( 3,'insertName' )
-> ON DUPLICATE KEY UPDATE uname='updateName';
Query OK, 2 rows affected (0.03 sec)

mysql> select * from test;+-----+------------+
| uid | uname |
+-----+------------+
| 1 | uname1 |
| 2 | uname2 |
| 3 | updateName |
+-----+------------+
3 rows in set (0.00 sec)

mysql> create index i_test_uname on test(uname);
Query OK, 3 rows affected (0.20 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> INSERT INTO test VALUES ( 1 , 'uname2') -> ON DUPLICATE KEY UPDATE uname='update2records';Query OK, 2 rows affected (0.00 sec)

mysql> select * from test;+-----+----------------+
| uid | uname |
+-----+----------------+
| 2 | uname2 |
| 1 | update2records |
| 3 | updateName |
+-----+----------------+
3 rows in set (0.00 sec)

插入時會與兩條記錄發生沖突,分別由主鍵和唯一索引引起。但最終只UPDATE了其中一條。這在手冊中也說明了,有多個唯一索引(或者有鍵也有唯一索引)的情況下,不建議使用該語句。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

os.path 模塊

os.path.abspath(path) #返回絕對路徑os.path.basename(path) #返回文件名os.path.commonprefix(list) #返回list(多個路徑)中,所有path共有的最長的路徑。os.path.dirname(path) #返回文件路徑os.path.exists(path) #路徑存在則返回True,路徑損壞返回Falseos.path…

探索性數據分析(EDA):Python

什么是探索性數據分析(EDA)? (What is Exploratory Data Analysis(EDA)?) If we want to explain EDA in simple terms, it means trying to understand the given data much better, so that we can make some sense out of it.如果我們想用簡單的術語來解釋EDA&a…

微服務框架---搭建 go-micro環境

1.安裝micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULEon export GOPROXYhttps://goproxy.io # windows下設置如下環境變量 setx GO111MODULE on setx GOPROXY https://goproxy.io # 使用如下指令安裝 go get -u -v github.com/micro/micro go get -u -v github.co…

angular dom_Angular 8 DOM查詢:ViewChild和ViewChildren示例

angular domThe ViewChild and ViewChildren decorators in Angular provide a way to access and manipulate DOM elements, directives and components. In this tutorial, well see an Angular 8 example of how to use the two decorators.Angular中的ViewChild和ViewChild…

浪潮之巔——IT產業的三大定律

http://www.cnblogs.com/ysocean/p/7641540.html轉載于:https://www.cnblogs.com/czlovezmt/p/8325772.html

DStream算子講解(一)

先把目錄列好,方便有條理的進行整理轉載于:https://www.cnblogs.com/leodaxin/p/7507600.html

aws 靜態網站_如何使用AWS托管靜態網站-入門指南

aws 靜態網站When I created my first portfolio last year, I based it on what I had learned from freeCodeCamp (HTML, CSS and a little JavaScript). 去年創建我的第一個投資組合時 ,我基于從freeCodeCamp (HTML,CSS和一些JavaScript)中學到的知識…

leetcode 27. 移除元素(雙指針)

給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素,并返回移除后數組的新長度。 不要使用額外的數組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。 元素的順序可以改變。你不需要考慮數組中超出新長度后面…

使用TVP批量插入數據

TVP(全稱 :Table-Valued Parameter) 叫做表值參數(Table-Valued Parameter)是SQL2008的一個新特性。顧名思義,表值參數表示你可以把一個表類型作為參數傳遞到函數或存儲過程里。 第一步:創建一個Type類型和寫入數據的原始表結構相…

python:找出兩個列表中相同和不同的元素(使用推導式)

#接口返回值 list1 [張三, 李四, 王五, 老二] #數據庫返回值 list2 [張三, 李四, 老二, 王七]a [x for x in list1 if x in list2] #兩個列表表都存在 b [y for y in (list1 list2) if y not in a] #兩個列表中的不同元素print(a的值為:,a) print(b的值為:,b)c [x for x …

springcloud(六):配置中心git示例

隨著線上項目變的日益龐大,每個項目都散落著各種配置文件,如果采用分布式的開發模式,需要的配置文件隨著服務增加而不斷增多。某一個基礎服務信息變更,都會引起一系列的更新和重啟,運維苦不堪言也容易出錯。配置中心便…

寫作工具_4種加快數據科學寫作速度的工具

寫作工具I’ve been writing about data science on Medium for just over two years. Writing, in particular, technical writing can be time-consuming. Not only do you need to come up with an idea, write well, edit your articles for accuracy and flow, and proofr…

leetcode 91. 解碼方法(dp)

解題思路 記憶化搜索,記錄已經計算過的子問題 代碼 func numDecodings(s string) int {temp:make([]int,len(s),len(s))for i : range temp {temp[i]-1}return de(s,0,temp) } func de(s string,cur int,dp []int) int {if curlen(s){return 1}if dp[cur]!-1{re…

python數據結構與算法

2019獨角獸企業重金招聘Python工程師標準>>> http://python.jobbole.com/tag/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/ 轉載于:https://my.oschina.net/u/3572879/blog/1611369

test5

test5 轉載于:https://www.cnblogs.com/Forever77/p/11468284.html

ux和ui_閱讀10個UI / UX設計系統所獲得的經驗教訓

ux和uiAs a way to improve my UI/UX skills I decided to read the guidelines for 10 popular UI/UX design systems. In this article I will give you a concise summary of the most important concepts. 為了提高我的UI / UX技能,我決定閱讀10種流行的UI / UX…

大數據(big data)_如何使用Big Query&Data Studio處理和可視化Google Cloud上的財務數據...

大數據(big data)介紹 (Introduction) This article will show you one of the ways you can process stock price data using Google Cloud Platform’s BigQuery, and build a simple dashboard on the processed data using Google Data Studio.本文將向您展示使用Google Cl…

第1次作業:閱讀優秀博文談感想

摘要:本文介紹第1次作業的詳細內容,包括評分標準。 注:本次作業提交截止時間為UTC8(北京時間),2017-9-17 22:00(星期日),以博客發表日期為準。 1. 作業內容 閱讀一些優秀博文(見第二…

ubuntu 16.04常用命令

ip配置: 終端輸入vi /etc/network/interfaces命令編輯配置文件,增加如下內容:         auto enp2s0    iface enp2s0 inet static    address 192.168.1.211    netmask 255.255.255.0    gateway 192.168.1.1 重啟網卡&#xf…

leetcode 28. 實現 strStr()(kmp)

實現 strStr() 函數。 給你兩個字符串 haystack 和 needle ,請你在 haystack 字符串中找出 needle 字符串出現的第一個位置(下標從 0 開始)。如果不存在,則返回 -1 。 說明: 當 needle 是空字符串時,我們…