MYSQL 4種插入數據的方式比較

4種插入數據的方式

 

第一種:insert into

 

insert into是最經常使用的插入數據的方式,能夠單條插入,也能夠多條,還能夠指定從其餘表中select而後插入。 詳細能夠參考:insert語法參考html

 

第二種:insert ignore into

 

加上ignore,當表中有相同鍵的時候,忽略插入。所以從效果上來講,就是以舊數據爲準。它和下面將要介紹的第三種插入方式正好相反。mysql

 

第三種:replace into

 

使用replace,若是表中有衝突的鍵,那麼先刪除這樣的行,而後插入。從效果上來講,就是以新數據爲準。 前面的兩種方式,要麼全舊,要麼全新,那麼有沒有折中的方式呢?這就是第四種:有選擇的替換。sql

 

第四種:insert into on duplicate key update

 

當發現衝突鍵的時候,有選擇的更新某些列的值。這裏有個特別的values函數,當遇到數據衝突時,能夠引用values中的值來更新相關的數據:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);數據庫

 

 

 

 

舉個例子,字段a被定義爲UNIQUE,而且原數據庫表table中已存在記錄(2,2,9)和(3,2,1),若是插入記錄的a值與原有記錄重複,則更新原有記錄,不然插入新行: 

函數

複製代碼代碼以下:

INSERT INTO TABLE (a,b,c) VALUES 
(1,2,3), 
(2,5,7), 
(3,3,6), 
(4,8,2) 
ON DUPLICATE KEY UPDATE b=VALUES(b); 


以上SQL語句的執行,發現(2,5,7)中的a與原有記錄(2,2,9)發生惟一值衝突,則執行ON DUPLICATE KEY UPDATE,將原有記錄(2,2,9)更新成(2,5,9),將(3,2,1)更新成(3,3,1),插入新記錄(1,2,3)和(4,8,2) 

注意:ON DUPLICATE KEY UPDATE只是MySQL的特有語法,並非SQL標準語法!spa

 

 

 

使用場景

 

有了上面的介紹,使用場景已很明瞭。特別說明幾點:code

 

    1. 若是表沒有主鍵,或主鍵是沒有意義的僞列,並且沒有其餘惟一約束,那麼請不要使用replace into,由於這種狀況下使用insert into一樣能夠作到,你多此一舉的效果可能就是像上面同樣,觸發bug。htm

    2. 若是表上有自增的主鍵,還有其餘惟一鍵,那麼使用replace into要當心了:其餘惟一鍵一旦衝突,舊數據會被刪除,而後插入新的數據行,結果就是自增主鍵的值愈來愈大,儘管表的數據量不大。久而久之,即便表的數據只有區區幾千行,可是自增列的值可能很是大,最後越界。這種狀況下能夠採用insert into on duplicate key update的方式。固然也能夠去掉自增的列,可是innodb的聚簇索引結構狀況下,修改主鍵是」比較愚蠢的作法」。索引

    3. 關於返回值的判斷:一條replace into語句可能會影響多行。若是一個表有多個惟一鍵,若是發生鍵衝突,必須先刪除一行,再試圖插入數據的時候,可能與第二個惟一鍵又衝突,又須要刪除…,所以有可能刪除了多行數據最後才成功插入一條數據。所以,被刪除的行數是受影響的行數減1。get

相關文章
相關標籤/搜索