MySQLとOracleの一括挿入SQLの汎用的な記述例
一例として
ここで、データベースのUSERテーブルにUserオブジェクトを一括して追加したい場合
public class User{
/ private String name;
/ private Integer age;
/ private Integer sex
private}
ほとんどの人は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');
オラクルは書き込みます。
// multiple single inserts
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');
//Batch insert
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の2つの書き込み方法はより面倒で、一括挿入も挿入されるカラム名を減らすことができないことがわかります。また、別の問題は、エンタープライズ開発では、ソフトウェアシステムは、複数のデータベースをサポートする必要がある場合がありますので、この新しい操作は、データベースの2つのセットに適応し、SQLの2つのセットを維持する必要があります、これは大幅に開発コストを増加させます。
では、普遍的な書き方はあるのでしょうか?答えは「イエス」です。
一般的な書き方。
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
これは、1つのSQLセットでシンプルかつメンテナンスが少なくて済むという、両方の長所を兼ね備えています。
以下は、XMLファイルへの様々な書き込み方法のコードです。
<! --MySQL bulk insert-->
<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's bulk insert -- >
<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文全体をループする必要があることがわかります。
<! --universal batch 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>
概要
MySQLとOracleの一括挿入SQLの一般的な書き方についてのこの記事はこれで終わりです、もっと関連するMySQLとOracleの一括挿入SQLの内容はBinaryDevelopの過去の記事を検索するか次の関連記事を閲覧し続けてください、あなたは将来BinaryDevelopをもっとサポートしてくれることを願っています
関連
-
MySQL Innodb インデックスメカニズム詳細解説
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySQLデータ型の詳細
-
MySQL サービスとデータベース管理
-
MySQLはこのようなUpdateステートメントを書くべきではありません
-
面接では選択式で聞かれましたが......。.for updateはテーブルをロックするか、行をロックするか?
-
mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
-
[解決済み】DynamoDB : 提供されたキー要素がスキーマと一致しません。
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ジョイントインデックスのためのmysqlの条件とインデックスが失敗するための条件
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
MySQLのselect、distinct、limitの使い方
-
MySQLで正規表現を使う 詳細
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
mysql5.7のインストールと、無料・長期利用を目的としたNavicateの導入プロセスについて
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する