SQL 批量插入和批量更新

2021-08-03 02:15:40 字數 1968 閱讀 5056

最新總是有人問我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秒。第二種方法是先將我們要插入的資料總結成一張表,然後進行表插入,這樣的效果明顯是比乙個乙個的插入快的。

insert into grade

(id,name)

select all

#,#union all select

我們知道我們跟新一般的跟著條件的,所以例如我們更新乙個實體集合的話,我們也是乙個乙個的更新,同樣,如果我們程式中利用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 *****

上邊的語句就是當人們的名稱是zhangsan的時候就批量更細id為漢語拼音,當人們的居住位址的時候就把他們的性別寫成英文。

當然最開始的時候我也沒有想到上邊的兩種方法,但是當我們的程式遇到效能問題的時候,又不得不去做優化,所以希望這篇部落格對哪些批量更新和批量插入的有一些幫組,但是這個還有一些問題,就是不能防止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...