最新總是有人問我sql優化的問題,大部分的原因就是更新實體集合或者更新,因為用的是持久化的框架,例如hibernate,entityfrmwork,所有這裡我總結一下如何在資料庫中利用sql進行批量的插入或者更新
如果兩張表的結構一樣,例如乙個表的結構和另乙個表的結構一樣,只是其中一張是臨時表,而另一張表是儲存資料的表,我們需要進行一次表的遷移的話,我們可以這樣。
insert into tb1 需要的列名 select 按照前面寫上需要的列名 from tb2
insert
into tb1 * select * from tb2
或者
insert
into tb1 id,name,address select id,name,address from tb2
如果對sql語句不熟悉,或者是持久層的框架,大部分是這麼寫的
insert
into tb_test(id,name) values(1,'zhangsan');
insert
into tb_test(id,name) values(2,'lisi');
insert
into tb_test(id,name) values(3,'wangwu');
但是按照這種做法,我嘗試了一下,一次插入2000條資料,大概需要2分鐘,但是如果我們用union all,如下:
insert
into tb_test(id,name)
select
4,'zhangsan'
union
allselect
5,'lisi'
union
allselect
6,'wangwu' ;
同樣是2000條資料,union all 方法是12秒。第二種方法是先將我們要插入的資料總結成一張表,然後進行表插入,這樣的效果明顯是比乙個乙個的插入快的。
我們知道我們跟新一般的跟著條件的,所以例如我們更新乙個實體集合的話,我們也是乙個乙個的更新,同樣,如果我們程式中利用for迴圈來批量更細的話,我們就得重複著,開啟資料庫,更新,關閉資料庫,而且我們的大部分時間都是消耗在開啟資料庫,關閉資料庫上邊了,而且批量更新通常需要依據條件來判斷更新哪條資料,但是乙個sql中只能有乙個where,所以union all顯然是不行的。
但是我在以前的部落格寫過case when的寫法,大家可以向一下,where就好像我們的if(條件)的「條件」,而他就好像我們的case 的when一樣,所以我們可以用case when 來實現多「where」,這樣的話就能實現多條記錄更新的問題。**如下:
update tb_test set name = 'zhangsan'
case id
when
'1'then
'yi'
when
'2'then
'er'
when
'3'then
'san'
end,
address='zhongguo'
case ***
when
'女'then
'femail'
when
'男'then
'mail'
endwhere *****
在這裡主要介紹下sql批量插入的用法,讓我們先看下批量刪除一般如何來做。
1.批量刪除很簡單,大家可能都用過:
delete from testtable where id in (1,3, 54,
68)
--sql2005下執行通過
當使用者在介面上不連續的選擇多項進行刪除時,該語句比迴圈呼叫多次刪除或多條delete語句中間加分號一次呼叫等方法都高效的多。
當然最開始的時候我也沒有想到上邊的兩種方法,但是當我們的程式遇到效能問題的時候,又不得不去做優化,所以希望這篇部落格對哪些批量更新和批量插入的有一些幫組,但是這個還有一些問題,就是不能防止sql注入的問題。所以使用要看情況。
SQL 批量插入和批量更新
最新總是有人問我sql優化的問題,大部分的原因就是更新實體集合或者更新,因為用的是持久化的框架,例如hibernate,entityfrmwork,所有這裡我總結一下如何在資料庫中利用sql進行批量的插入或者更新 如果兩張表的結構一樣,例如乙個表的結構和另乙個表的結構一樣,只是其中一張是臨時表,而另...
mybatis批量插入,批量更新
insert into t ingco trade lithium electric product product no,li e product no,transpor report number,msds,transpor report number path,msds path,un tes...
批量更新sql 批量update sql
批量更新sql 批量update sql 批量更新表時,update乙個表的列時,需要依賴另外的表,這種依賴可以是where條件子句,也可以要update的field的值依賴另外的表 通常有兩種做法 1.使用儲存過程 2.在程式 裡逐條迴圈執行 這裡給出一種更高效 簡潔的做法,批量更新sql 一句s...