1. 程式人生 > 其它 >MySQL、Oracle批量插入SQL的通用寫法

MySQL、Oracle批量插入SQL的通用寫法

舉個例子:

現在要批量新增User物件到資料庫USER表中

public class User{
    //姓名
    private String name;
    //年齡
    private Integer age;
    //性別
    private Integer sex
}

大部分人對MySQL比較熟悉,可能覺得批量新增的SQL都是這樣寫,其實並不然。該寫法在MySQL中沒問題,而在Oracle中,這樣寫就會報錯。

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;

可以發現Oracle的兩種寫法都比較的麻煩,批量插入也壓根沒有減少插入的列名。除此之外,另一個麻煩的事情就是,在企業開發中,一套軟體系統可能需要支援多套資料庫的,因此這條新增的操作,就得適配兩套資料庫,維護兩套SQL,大大地增加了開發成本。

那麼有沒有一種通用的寫法呢?答案是有的。

通用寫法:

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

這樣一來,既簡單又能少維護一套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>

仔細觀察MySQL和Oracle的寫法,因為MySQL支援上述在VALUES後面直接插入多條資料,因此。foreach標籤只需要迴圈遍歷出VALUES後面()裡的內容即可;而Oracle因為不支援這種寫法因此需要迴圈遍歷整個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>