実用的な 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 5.7.18 無料インストール版ウィンドウ設定方法

初めてのブログです。データベースの勉強を始めた頃のことを書いています。自分でダウンロードしたのですが...

Vue は水の波紋効果のクリックフィードバック指示を実装します

目次水波効果実装を見てみましょう水の波紋のデフォルトスタイルをカスタマイズする水の波紋の位置と直径を...

div画像マーキーシームレス接続実装コード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <ス...

Vueナンバープレート入力コンポーネントの使い方の詳しい説明

参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...

Vue2.0/3.0双方向データバインディングの実装原理の詳細説明

Vue2.0/3.0双方向データバインディングの実装原理双方向データバインディングとは、データの変更...

Dockerコンテナを終了した後も実行を継続する方法

現象:イメージを実行します (例: ubuntu14.04)。 docker run -it --r...

フラッシュプラグインを使用してPCのカメラを呼び出し、TMLページに埋め込む方法

序文この記事を書いた主な理由は、チームリーダーが、ブラウザを使用してコンピューターのカメラを呼び出し...

MySQL オンライン DDL ツール gh-ost 原理分析

目次1. はじめに1.1 原則1.2 プロセス1.3 特徴1.4 githubアドレス2. テスト環...

MySQLデータベースは何をするのか

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

Excel エクスポートは docker 環境では常に失敗する

Excel のエクスポートは、docker 環境では常に失敗します。最も直接的な原因は、中国語フォン...

ins タグと del タグの属性と使用法

insとdel は、HTML 4.0 で導入され、文書の作成時に作成者が共同作業できるようにし、また...

画像のプリロードと遅延ロードを実装するJavaScript

この記事では、JavaScriptで画像のプリロードと遅延ロードを実装するための具体的なコードを参考...

Mysql 自己結合クエリ例の詳細な説明

この記事では、Mysql の自己結合クエリについて説明します。ご参考までに、詳細は以下の通りです。自...

Zabbixで監視する必要があるホストを追加するための詳細な手順

監視ホストの追加ホスト 192.168.179.104 が zabbix 監視項目に追加されます (...