摘抄自:https://yjclsx.blog.csdn.net/article/details/83898545
mysql中常用的三種插入數據的語句
insert into表示插入數據,數據庫會檢查主鍵,如果出現重復會報錯;
replace into表示插入替換數據,需求表中有PrimaryKey,或者unique索引,如果數據庫已經存在數據,則用新數據替換,如果沒有數據效果則和insert into一樣;
insert ignore into表示如果已經存在相同的記錄,比如主鍵或者唯一性字段沖突,則忽略當前新數據;
還有一種和replace into功能類似的語句:insert into ... on duplicate key update,他們的區別如下。
Replace into與Insert into ... on duplicate key update的區別
相同點:
(1)沒有存在沖突的時候,replace into與insert into ... on duplicate key update相同,就是插入一條新的數據,返回的影響行數是1。
(2)存在沖突的時候,都會用新數據替換老數據,返回的影響行數是2。
(3)都支持批量更新,當插入的多條數據中有沖突時,會更新其中沖突的那幾條。例如 replace into table (col_1,col_2) values ('v1','v2'),('v3','v4'),('v5','v6'); 和 insert into table (col_1,col_2) values ('v1','v2'),('v3','v4'),('v5','v6') on duplicate key update col_1=VALUES(col_1),col_2=VALUES(col_2);
不同點:
存在沖突的時候,replace into是delete老記錄,然后錄入新的記錄,所以原有的所有記錄會被清除,這個時候,如果replace into語句的字段不全的話,有些原有的字段的值會被自動填充為默認值,
同時AUTO_INCREMENT的主鍵會自動+1。
而insert into ... on duplicate key update則只執行update標記之后的sql,從表象上來看相當於一個簡單的update語句,所以他保留了所有未修改的字段的舊值。
從底層執行效率上來講,replace into要比insert into ... on duplicate key update效率要高,但是在寫replace into的時候,字段要寫全,防止老的字段數據被刪除。
在實際工作中,經常會需要saveOrUpdate的操作,這時候通常使用的是insert into ... on duplicate key update,以保留未修改的數據。
提高插入性能
注意,當插入的數據量很大時,為了提高插入的性能:
1、可以批量插入VALUES,就是一個values跟很多條數據,每條數據用英文逗號隔開,最后一條才用分號,而不是每一次插入都是一條數據。
如:insert into table (col_1,col_2) values ('v1','v2'),('v3','v4'),('v5','v6');
這個效果提升地很明顯,以前地區表有幾萬條數據,一條條insert要幾分鍾,用了批量插入values,瞬間就完成了!
2、刪除MySQL的索引,有索引的存在,插入速度會受很大的影響。