実用的な MySQL + PostgreSQL バッチ挿入更新 insertOrUpdate

実用的な MySQL + PostgreSQL バッチ挿入更新 insertOrUpdate

1. 百度百科事典

1. MySQL

MySQL は最も人気のあるオープンソース データベースであると主張しています。 LAMP の M は MySQL を表します。 LAMP 上に構築されたアプリケーション (WordPress、Drupal、その他のほとんどの PHP オープンソース プログラムなど) では、MySQL が使用されます。

MySQL はもともと MySQL AB によって開発され、その後 2008 年に 10 億ドルで Sun に売却され、2010 年に Oracle に買収されました。 Oracle は、Standard、Enterprise、Classic、Cluster、Embedded、Community など、MySQL の複数のバージョンをサポートしています。無料でダウンロードできるものもあれば、有料のものもあります。

そのコアコードは GPL ライセンスに基づいています。MySQL は Oracle によって管理されているため、コミュニティは MySQL のオープンソースに影響を与えることを懸念しており、MariaDB や Percona などのいくつかのブランチが開発されています。

2. PostgreSQL

PostgreSQL は、世界で最も先進的なオープンソース データベースであると自称しています。

PostgreSQL のファンの中には、高価格や高圧的なカスタマー サービスがないにもかかわらず、Oracle に匹敵する製品だと言う人もいます。

もともとは、Ingres データベースの後継として 1985 年にカリフォルニア大学バークレー校で開発されました。 PostgreSQL は完全にコミュニティ主導のオープンソース プロジェクトです。

複数の異なるコミュニティ、ビジネス、エンタープライズ エディションを提供する MySQL とは異なり、完全に機能する単一のバージョンを提供します。

PostgreSQL は、著作権表示を記載する限り、組織がコードを使用、コピー、変更、再配布できる自由な BSD/MIT ライセンスに基づいています。

3. MySQL に対する PostgreSQL の利点

(1)リレーショナルデータベースだけでなく、以下のものを保存できる:

配列は、1 ビット配列でもマルチビット配列でも、テキスト ストレージを使用するよりもはるかに効率的な json (hStore) と jsonb をサポートします。

(2)地理情報処理拡張のサポート

(3)REST APIを素早く構築できる

(4)Rツリーなどのスケーラブルなインデックスタイプのサポートにより、特殊なデータの処理が容易になります。 MySQL ではツリーのような設計を扱うのは非常に複雑で、多くのコードを記述する必要がありますが、PostgreSQL ではツリー構造を効率的に処理できます。

(5)外部データソースのサポート強化

(6)文字列の長さに制限はない

等...

2. postgres での InsertOrUpdate コード例

1. ユーザーテーブルを作成する

テーブルpublic.t_userを作成します(
    ユーザー名varchar(100) NOT NULL、
    年齢 int4 NOT NULL デフォルト 0,
    "パスワード" varchar(100) NULL,
    削除された int4 NULL、
    created_time タイムスタンプ NULL
);
btree (ユーザー名、パスワード、年齢) を使用して、public.t_user に t_user_union_name_age_password という一意のインデックスを作成します。

2. 達成する簡単な方法

入れる
    の中へ
    public.t_user (ユーザー名、パスワード、年齢、作成時刻)
値('zs'、'123'、18、now())、('ls'、'123456'、19、now())、('ww'、'123'、20、now()) 
競合 (ユーザー名、年齢、パスワード) が発生した場合は、ユーザー名 = removed.username、年齢 = removed.age、パスワード = removed.password、作成時間 = removed.created_time を設定して更新します。

3. unnest関数を使用して実装する

入れる
    の中へ
    public.t_user (ユーザー名、パスワード、年齢、作成時刻)
値(unnest(array['zs'、'ls'、'ww'])、unnest(array['123'、'123'、'123456'])、unnest(array[18、19、20])、unnest(array[now()、now()、now(])) 
競合 (ユーザー名、年齢、パスワード) が発生した場合は、ユーザー名 = removed.username、年齢 = removed.age、パスワード = removed.password、作成時間 = removed.created_time を設定して更新します。

4. データがすでに存在する場合は何もしない

3. 関連する主要機能の紹介

1. ネスト解除(任意の配列)

unnest 関数は、入力配列を、各列が対応する配列内の要素を表すテーブルに変換します。
unnest が select に他のフィールドと共に出現する場合、それは他のフィールドとの join と同等です。

主に行から列への変換のシナリオを完了するために使用されます。

INSERT ON CONFLICT は、PostgreSQL の挿入更新機能を実装します。

EXCLUDED仮想テーブルには更新したいレコードが含まれています

4. userMapper.xmlの作成

<?xml バージョン="1.0" エンコーディング="UTF-8" ?>
<!DOCTYPE マッパー PUBLIC "-//mybatis.org//DTD マッパー 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<マッパー名前空間="com.guor.dao.UserMapper">
 
    <!-- バッチ挿入 -->
    <挿入 id="batchInsert" パラメータタイプ="java.util.HashMap">
         <include refid="batchInsertSql"></include>
    </挿入>
 
    <sql id="バッチ挿入SQL">
        ${map.tableInfo.schemaName}.${map.tableInfo.tableName} に挿入します
        (
        "テーブルID",
        "ファイル名"、
        「作成時間」、
        <foreach collection="map.list.get(0)" index="キー" item="値"
                 セパレーター=",">
            「${キー}」
        </foreach>
        )
        価値観
        <foreach コレクション="map.list" アイテム="リスト" セパレーター=",">
            (
            ${map.tableInfo.tableId},
            #{map.tableInfo.fileName},
            今()、
            <foreach コレクション="リスト" インデックス="キー" 項目="値"
                     セパレーター=",">
                <選択>
                    <test="map.varcharList.contains(key)">の場合
                        #{価値}
                    </いつ>
                    <test="map.dateList.contains(key)">の場合
                        TO_TIMESTAMP(#{値},'yyyy-MM-dd hh24:mi:ss')
                    </いつ>
                    <それ以外の場合>
                        ${値}
                    </そうでない場合>
                </選択>
            </foreach>
            )
        </foreach>
    </sql>
 
    <!-- バッチ挿入更新 -->
    <挿入 id="batchInsertOrUpdate" パラメータタイプ="java.util.HashMap">
        <include refid="batchInsertSql"></include>
        紛争について(
        ファイル名、テーブルID
        <if test="map.tableInfo.flag">
            , "id_number"
        </if>
        )更新する
        セット
        "table_id" = 除外。"table_id",
        "file_name" = 除外。"file_name",
        "create_time" = 除外。"create_time",
        <foreach collection="map.list.get(0)" index="キー" セパレーター=",">
            "${key}" = 除外。"${key}"
        </foreach>
    </挿入>
</マッパー>

V. MySQL での InsertOrUpdate コード例

1. テーブルステートメントを作成する

テーブル `t_user` を作成します (
  `username` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(0) NULL デフォルト NULL,
  `address` varchar(255) 文字セット utf8 COLLATE utf8_general_ci NULL デフォルト NULL,
  `create_time` datetime(0) NULL デフォルト NULL,
  `update_time` datetime(0) NULL デフォルト NULL,
  `version` int(0) NOT NULL,
  BTREE を使用した一意のインデックス `user_union_index`(`username`, `password`, `age`)
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2. 通常の方法

t_userに挿入
(ユーザー名、パスワード、年齢、作成時間) 
VALUES('张三' ,'123456',18,NOW())
重複キーの更新について 
username='张三',
パスワード='123456',
create_time=今()

3. 重複キーの更新について

重複キー更新時の insert into は、データの挿入と更新を意味します。レコードに PrimaryKey または一意のインデックスがある場合、データベースにすでにデータがあれば、新しいデータで更新されます。データがない場合、効果は insert into と同じです。

t_userに挿入 
(ユーザー名、パスワード、年齢、作成時刻、更新時刻、バージョン)
値( 'zs' ,'123',10,now(),now(),1) 
,( 'ls' ,'123456',20,now(),now(),1) 
,( 'ww' ,'123',30,今(),今(),1) 
重複キーの更新について 
ユーザー名= VALUES(ユーザー名)
,password=VALUES(パスワード)
,年齢=VALUES(年齢)
,update_time=VALUES(更新時間)
バージョン = バージョン + 1

4. 置き換える

replace into は、データを挿入して置き換えることを意味します。レコードに PrimaryKey または一意のインデックスがある場合、データベースにすでにデータがある場合は、新しいデータに置き換えられます (最初に削除してから挿入します)。データがない場合、効果は insert into と同じです。

t_userに置き換える 
(ユーザー名、パスワード、年齢、作成時刻、更新時刻、バージョン) 
価値観 
( 'zs' ,'123',10,今(),今(),1)

5. 無視を挿入する

insert ignore into は、競合を可能な限り無視して、激しく挿入することを意味します。

t_userに無視を挿入 
(ユーザー名、パスワード、年齢、作成時刻、更新時刻、バージョン) 
価値観 
( 'zs' ,'123',10,now(),now(),1) ,
('ネザ','123',30,現在(),現在(),2)

6. まとめ

バッチで insert into values または insert into select を実行する場合、トランザクションの原子性と一貫性は満たされますが、 insert into select のロックの問題には注意が必要です。
重複キー更新時の replace into と insert into はどちらも、バッチ挿入と更新を実装できます。更新か挿入かは、レコード内の pk データまたは uk データがテーブルに存在するかどうかによって決まります。

存在する場合、前者は最初に削除してから挿入し、後者は更新します。
insert ignore into は多くのデータの競合と制約を無視するため、ほとんど使用されません。

これで、MySQL + PostgreSQL バッチ挿入または更新の実装方法に関するこの記事は終了です。MySQL + PostgreSQL バッチ挿入または更新の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • PostgreSQLデータベースの更新が遅い理由を解決する
  • 更新テスト用のPostgreSQLの行レベルロックに基づく
  • PostgreSQLバッチ更新とOracleの違いの詳細な説明
  • Postgres の UPDATE ステートメントのソースコード分析

<<:  HTML タグでの this の使用法の紹介

>>:  LinuxカーネルマクロContainer_Ofの詳細な説明

推薦する

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

音楽プレーヤーアプリ(アプリケーションソフトウェア)の分析と再設計 美しい音楽プレーヤーインターフェースの設計方法

無線インタラクションにずっと興味があったので、今回は実践してみようと思います〜この分析と評価は iO...

MySQL フラッシュリストとダーティページフラッシュメカニズム

1. レビューMySQL の起動後にバッファ プールが初期化されます。バッファ プールは N 個の空...

Linux でハードディスクのサイズを確認し、ハードディスクをマウントする方法

Linux には、マウントされたハードディスクとマウントされていないハードディスクの 2 種類のハー...

IE イメージ ツールバーを無効にする

IE6 で試してみたところ、ツールバーが表示されました。オプションに「イメージ ツールバーを有効にす...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...

iframe src 割り当ての問題 (サーバー側)

今日この問題に遭遇しました。サーバー側でiframeのsrc値を再割り当てし、iframeにIDを追...

emとは?emとpxの紹介と変換方法

それは何ですか? em はフォントの高さを指し、どのブラウザでもデフォルトのフォントの高さは 16 ...

JavaプログラミングでJavaScriptの超実用的なテーブルプラグインを書く

目次効果ドキュメント最初のステップステップ2ステップ3ソースコード効果ドキュメント最初のステップta...

Nginx リバース プロキシと負荷分散を実装する方法 (Linux ベース)

ここで nginx のリバース プロキシを試してみましょう。リバースプロキシ方式とは、インターネット...

Dockerを使用してシンプルなJava開発およびコンパイル環境を構築する方法の詳細な説明

Java 言語には多くのバージョンがあります。一般的に使用されている Java 8 に加えて、一部の...

CSS3 における構造擬似クラスセレクターと擬似要素セレクターの使い方の詳細な説明

構造擬似クラスセレクタの紹介構造擬似クラスセレクターは、いくつかの特殊効果を処理するために使用されま...

MySQL の準同期レプリケーションについての簡単な説明

導入MySQL はレプリケーションを通じてストレージ システムの高可用性を実現します。現在、MySQ...

背景属性の8つの属性値の詳細解説(面接の質問)

CSSの背景プロパティの値背景色背景画像背景繰り返し背景位置背景添付複合プロパティ: 背景: ba...

Linux に MySQL 8.0.19 をインストールするための詳細な手順と問題解決方法

最近Tencent Cloudサーバーを購入し、環境を構築しました。このメモは、これまで MySQL...