MySQL和Oracle批量插入SQL的通用寫法示例
舉個(gè)例子:
現(xiàn)在要批量新增User對象到數(shù)據(jù)庫USER表中
public class User{
//姓名
private String name;
//年齡
private Integer age;
//性別
private Integer sex
}
大部分人對MySQL比較熟悉,可能覺得批量新增的SQL都是這樣寫,其實(shí)并不然。該寫法在MySQL中沒問題,而在Oracle中,這樣寫就會(huì)報(bào)錯(cuò)。
MySQL寫法:
INSERT INTO USER
(NAME,AGE,SEX)
VALUES
('val1_1', 'val1_2', 'val1_3'),
('val2_1', 'val2_2', 'val2_3'),
('val3_1', 'val3_2', 'val3_3');
Oracle寫法:
//多次單條插入
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3');
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3');
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3');
//批量插入
INSERT ALL
INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3')
INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3')
INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3')
SELECT 1 FROM DUAL;
可以發(fā)現(xiàn)Oracle的兩種寫法都比較的麻煩,批量插入也壓根沒有減少插入的列名。除此之外,另一個(gè)麻煩的事情就是,在企業(yè)開發(fā)中,一套軟件系統(tǒng)可能需要支持多套數(shù)據(jù)庫的,因此這條新增的操作,就得適配兩套數(shù)據(jù)庫,維護(hù)兩套SQL,大大地增加了開發(fā)成本。
那么有沒有一種通用的寫法呢?答案是有的。
通用寫法:
INSERT INTO USER (NAME,AGE,SEX)
select ('val1_1', 'val1_2', 'val1_3') from dual union all
select ('val2_1', 'val2_2', 'val2_3') from dual union all
select ('val3_1', 'val3_2', 'val3_3') from dual
這樣一來,既簡單又能少維護(hù)一套SQL,兩全其美。
下面是XML文件里各種寫法的代碼。
<!--MySQL的批量插入-->
<insert id="batchInsertUser" databaseId="mysql">
INSERT INTO USER
(NAME,AGE,SEX)
VALUES
<foreach collection="userList" index="index" item="user" separator=",">
(#{user.name},#{user.age},#{user.sex})
</foreach>
</insert>
<!--Oracle的批量插入-->
<insert id="batchInsertUser" databaseId="oracle">
BEGIN
<foreach collection="userList" index="index" item="user" separator=";">
INSERT INTO USER
(NAME,AGE,SEX)
VALUES
(#{user.name},#{user.age},#{user.sex})
</foreach>
;END;
</insert>
仔細(xì)觀察MySQL和Oracle的寫法,因?yàn)镸ySQL支持上述在VALUES后面直接插入多條數(shù)據(jù),因此。foreach標(biāo)簽只需要循環(huán)遍歷出VALUES后面()里的內(nèi)容即可;而Oracle因?yàn)椴恢С诌@種寫法因此需要循環(huán)遍歷整個(gè)INSERT語句。
<!--通用的批量插入-->
<insert id="batchInsertUser" databaseId="mysql">
INSERT INTO USER
(NAME,AGE,SEX)
<foreach collection="userList" index="index" item="user" separator="union all">
SELECT
(#{user.name},#{user.age},#{user.sex})
FROM DUAL
</foreach>
</insert>
總結(jié)
到此這篇關(guān)于MySQL和Oracle批量插入SQL的通用寫法的文章就介紹到這了,更多相關(guān)MySQL和Oracle批量插入SQL內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信