tft每日頭條

 > 生活

 > sql語言中的insert

sql語言中的insert

生活 更新时间:2024-12-05 04:23:55

sql語言中的insert?我們在業務開發中經常遇到這樣的情況,當數據庫已經存在同一主鍵的數據,則執行update操作,如果不存在,則執行insert操作用update和insert語句可以滿足要求,但是需要先查詢數據庫中有沒有該記錄,根據查詢結果再判斷是執行update還是insert對于單條語句來說很适合,但是對于多條批量大數據操作時比較浪費性能,今天小編就來聊一聊關于sql語言中的insert?接下來我們就一起去研究一下吧!

sql語言中的insert(如何優雅地結合insert和update)1

sql語言中的insert

背景

我們在業務開發中經常遇到這樣的情況,當數據庫已經存在同一主鍵的數據,則執行update操作,如果不存在,則執行insert操作。用update和insert語句可以滿足要求,但是需要先查詢數據庫中有沒有該記錄,根據查詢結果再判斷是執行update還是insert。對于單條語句來說很适合,但是對于多條批量大數據操作時比較浪費性能。

解決方法

第1種解決方式:replace into

replace into 首先嘗試插入數據到表中,

1. 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先删除此行數據,然後插入新的數據。

2. 否則,直接插入新數據。

REPLACE INTO `table_name`(`col_name`, ...) VALUES (...); REPLACE INTO `table_name` (`col_name`, ...) SELECT ...; REPLACE INTO `table_name` SET `col_name`='value';

第2種解決方式:INSERT ... ON DUPLICATE KEY UPDATE

首先,此語法的前提是表中一定要有個唯一的索引或者主鍵

具體使用如下:

單條操作

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

這裡假設a是主鍵,當數據庫中存在a=1的記錄時,将c的值設置為c 1

多條操作

用VALUES關鍵字

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

這裡假設a是主鍵,當數據庫中存在a=1的記錄時,将b的值設置為2,否則插入新數據a=1,b=2,c=3; 當數據庫中存在a=4的記錄時,将b的值設置為5,否則插入新數據a=4,b=5,c=6

性能對比

在數據庫數據量很少的時候,這兩種方式都很快,無論是直接的插入還是有沖突時的更新,都不錯,但在數據庫表的内容數量比較大(如百萬級)的時候,兩種方式就不太一樣了,

首先是直接的插入操作,兩種的插入效率都略低,比如直接向表裡插入1000條數據(百萬級的表(innodb引擎)),二者都差不多需要5,6甚至十幾秒。究其原因,主要是在向大數據表批量插入數據的時候,每次的插入都要維護索引的,索引固然可以提高查詢的效率,但在更新表尤其是大表的時候,索引就成了一個不得不考慮的問題了。

其次是更新表,這裡的更新的時候是帶主鍵值的(因為我是從另一個表獲取數據再插入,要求主鍵不能變)同樣直接更新1000條數據,replace的操作要比insert on duplicate的操作低太多太多,當insert瞬間完成(感覺)的時候,replace要7、8s, replace慢的原因是更新數據的時候,要先删除舊的,然後插入新的,在這個過程中,還要重新維護索引,insert on duplicate 的更新操作雖然也會更新數據,但其對主鍵的索引卻不會有改變,也就是說,insert on duplicate 更新對主鍵索引沒有影響.因此對索引的維護成本就低了一些(如果更新的字段不包括主鍵,那就要另說了)。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved