【MySQL】面試官問我:MySQL如何實現無數據插入,有數據更新?我是這樣回答的!

寫在前面

馬上就是金九銀十的跳槽黃金期了,很多讀者都開始出去面試了。這不,又一名讀者出去面試被面試官問了一個MySQL的問題:向MySQL中插入數據,如何實現MySQL中沒有當前id標識的數據時插入數據,有當前id標識的數據時更新數據。其實,這題目一點也不難!!

先來個簡單題目

正式回答這個面試題時,我們先來看一個簡單點的題目:如何實現向MySQL中插入數據時,存在則忽略,不存在就插入?其實,這個簡單點的題目與標題的題目有相同的地方:都是MySQL中不存在待插入的數據時,就將待插入的數據插入到MySQL中。不同點是:標題中的題目是存在待插入的數據時執行更新操作,而這個簡單點的題目是存在待插入的數據時直接忽略,不執行任何操作。

我們先來回答這個簡單點的題目。其實,在面試過程中,我們需要揣測面試官的心理,很顯然,這裡,面試官是想問如何通過SQL語句來實現,並且這樣的題目往往都會有一個前置條件:那就是數據表中必須存在唯一鍵,也就是唯一索引。如果你回答的是你寫了一段Java代碼或者C語言代碼來實現,那你就基本被pass了。這沒得說,因為你回答的方向與面試預期的方向不同!

關於這個簡單點的題目,我們可以使用insert ignore語句實現。語法格式如下所示。

insert ignore into table(col1,col2) values ('value1','value2');

比如,我們執行如下SQL語句向MySQL中插入數據。

insert ignore into user_info (last_name,first_name) values ('binghe','binghe');

這樣一來,如果表中已經存在last_name=’binghe’且first_name=’binghe’的數據,就不會插入,如果沒有就會插入一條新數據。

上面的是一種用法,也可以用 INSERT …. SELECT 語句來實現,這裡就不舉例了。

分析標題題目

接下來,我們再來看標題中的題目,向MySQL中插入數據,存在就更新,不存在則插入。本質上數據表中還是需要存在唯一鍵,也就是唯一索引的。往往在面試中,面試官都會默許存在這些前置條件。

這裡,有兩種方法可以實現這個效果。一種方法是結合INSERT語句和ON DUPLICATE KEY UPDATE語句實現,另一種方法是通過REPLACE語句實現。

INSERT語句和ON DUPLICATE KEY UPDATE語句實現

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

INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=c+1; 
UPDATE table SET c=c+1 WHERE a=1; 

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

REPLACE語句實現

使用REPLACE的最大好處就是可以將DELETE和INSERT合二為一,形成一個原子操作。這樣就可以不必考慮在同時使用DELETE和INSERT時添加事務等複雜操作了。在使用REPLACE時,表中必須有唯一索引,而且這個索引所在的字段不能允許空值,否則REPLACE就和INSERT完全一樣的。在執行REPLACE後,系統返回了所影響的行數,如果返回1,說明在表中並沒有重複的記錄,如果返回2,說明有一條重複記錄,系統自動先調用了DELETE刪除這條記錄,然後再記錄用INSERT來插入這條記錄。

語法和INSERT非常的相似,如下面的REPLACE語句是插入或更新一條記錄。

REPLACE INTO users (id,name,age) VALUES(1, 'binghe', 18); 

重磅福利

關注「 冰河技術 」微信公眾號,後台回復 「設計模式」 關鍵字領取《深入淺出Java 23種設計模式》PDF文檔。回復「Java8」關鍵字領取《Java8新特性教程》PDF文檔。回復「限流」關鍵字獲取《億級流量下的分佈式限流解決方案》PDF文檔,三本PDF均是由冰河原創並整理的超硬核教程,面試必備!!

好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!

寫在最後

如果你覺得冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習高並發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公眾號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!

Tags: