Praktisches MySQL + PostgreSQL Batch-Insert-Update insertOrUpdate

Praktisches MySQL + PostgreSQL Batch-Insert-Update insertOrUpdate

1. Baidu-Enzyklopädie

1. MySQL

MySQL behauptet, die beliebteste Open-Source-Datenbank zu sein. Das M in LAMP bezieht sich auf MySQL. Auf LAMP erstellte Anwendungen verwenden MySQL, etwa WordPress, Drupal und die meisten anderen PHP-Open-Source-Programme.

MySQL wurde ursprünglich von MySQL AB entwickelt und 2008 für 1 Milliarde Dollar an Sun verkauft, das 2010 von Oracle übernommen wurde. Oracle unterstützt mehrere Versionen von MySQL: Standard, Enterprise, Classic, Cluster, Embedded und Community. Einige davon können kostenlos heruntergeladen werden, andere sind kostenpflichtig.

Der Kerncode basiert auf der GPL-Lizenz. Da MySQL von Oracle kontrolliert wird, befürchtet die Community, dass dies Auswirkungen auf die Open Source von MySQL haben könnte. Daher wurden einige Zweige entwickelt, beispielsweise MariaDB und Percona.

2. PostgreSQL

PostgreSQL bezeichnet sich selbst als die weltweit fortschrittlichste Open-Source-Datenbank.

Einige Fans von PostgreSQL sagen, es sei mit Oracle vergleichbar, jedoch ohne den hohen Preis und den aufdringlichen Kundendienst.

Es wurde ursprünglich 1985 an der University of California, Berkeley als Nachfolger der Ingres-Datenbank entwickelt. PostgreSQL ist ein vollständig von der Community betriebenes Open-Source-Projekt.

Es bietet eine einzige voll funktionsfähige Version, im Gegensatz zu MySQL, das mehrere verschiedene Community-, Business- und Enterprise-Editionen bietet.

PostgreSQL basiert auf der liberalen BSD/MIT-Lizenz, die es Organisationen ermöglicht, den Code zu verwenden, zu kopieren, zu ändern und weiterzugeben, solange sie einen Copyright-Vermerk angeben.

3. Vorteile von PostgreSQL gegenüber MySQL

(1) Es handelt sich nicht nur um eine relationale Datenbank, sondern sie kann auch speichern:

Arrays, egal ob Ein-Bit-Arrays oder Mehr-Bit-Arrays, unterstützen JSON (hStore) und JSONB, was viel effizienter ist als die Verwendung von Textspeichern.

(2) Unterstützung der Erweiterung zur Verarbeitung geografischer Informationen

(3) REST-API kann schnell erstellt werden

(4) Die Unterstützung skalierbarer Indextypen wie R-Bäume erleichtert die Verarbeitung einiger spezieller Daten. Für MySQL ist die Verarbeitung baumartiger Designs sehr kompliziert und es muss viel Code geschrieben werden. PostgreSQL kann jedoch effizient mit Baumstrukturen umgehen.

(5) Bessere Unterstützung externer Datenquellen

(6) Es gibt keine Längenbeschränkung für Zeichenfolgen

usw...

2. InsertOrUpdate-Codebeispiel in Postgres

1. Erstellen Sie die Benutzertabelle

Tabelle erstellen public.t_user (
    Benutzername varchar(100) NOT NULL,
    Alter int4 NICHT NULL STANDARD 0,
    "Passwort" varchar(100) NULL,
    gelöscht int4 NULL,
    created_time Zeitstempel NULL
);
ERSTELLEN SIE EINEN EINDEUTIGEN INDEX t_user_union_name_age_password ON public.t_user USING btree (Benutzername, Passwort, Alter);

2. Einfacher Weg zum Erreichen

einfügen
    hinein
    public.t_user (Benutzername, Passwort, Alter, Erstellungszeit)
Werte ('zs', '123', 18,jetzt()), ('ls', '123456', 19,jetzt()),('ww', '123', 20,jetzt()) 
bei Konflikten (Benutzername, Alter, Passwort) Update durchführen: Benutzername = ausgeschlossen.Benutzername,Alter = ausgeschlossen.Alter,Passwort = ausgeschlossen.Passwort,Erstellungszeit = ausgeschlossen.Erstellungszeit

3. Verwenden Sie die Unnest-Funktion zur Implementierung

einfügen
    hinein
    public.t_user (Benutzername, Passwort, Alter, Erstellungszeit)
Werte (unnest(array['zs', 'ls', 'ww']), unnest(array['123', '123', '123456']), unnest(array[18, 19, 20]), unnest(array[jetzt(), jetzt(), jetzt()])) 
bei Konflikten (Benutzername, Alter, Passwort) Update durchführen: Benutzername = ausgeschlossen.Benutzername,Alter = ausgeschlossen.Alter,Passwort = ausgeschlossen.Passwort,Erstellungszeit = ausgeschlossen.Erstellungszeit

4. Wenn die Daten bereits vorhanden sind, tun Sie nichts

3. Einführung in verwandte Schlüsselfunktionen

1. aufheben (beliebiges Array)

Die Funktion „Unnest“ konvertiert das Eingabearray in eine Tabelle, in der jede Spalte ein Element im entsprechenden Array darstellt.
Wenn „unnest“ in „select“ zusammen mit anderen Feldern vorkommt, ist dies gleichbedeutend mit einem Join mit anderen Feldern.

Wird hauptsächlich verwendet, um das Szenario der Konvertierung von Zeilen in Spalten abzuschließen.

INSERT ON CONFLICT implementiert die PostgreSQL-Einfüge- und Aktualisierungsfunktion.

Die virtuelle Tabelle EXCLUDED enthält die Datensätze, die wir aktualisieren möchten

4. Schreiben von userMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.guor.dao.UserMapper">
 
    <!-- Stapeleinfügung -->
    <insert id="batchInsert" parameterType="java.util.HashMap">
         <include refid="batchInsertSql"></include>
    </einfügen>
 
    <sql id="batchInsertSql">
        INSERT INTO ${map.tableInfo.schemaName}.${map.tableInfo.tableName}
        (
        "Tabellen-ID",
        "Dateiname",
        "Erstellungszeit",
        <foreach-Sammlung="map.list.get(0)" index="Schlüssel" item="Wert"
                 Trennzeichen=",">
            "${Schlüssel}"
        </foreach>
        )
        WERTE
        <foreach-Sammlung="Karte.Liste" Element="Liste" Trennzeichen=",">
            (
            ${map.tableInfo.tableId},
            #{map.tableInfo.fileName},
            Jetzt(),
            <foreach Sammlung="Liste" Index="Schlüssel" Element="Wert"
                     Trennzeichen=",">
                <wählen>
                    <wenn test="map.varcharList.contains(key)">
                        #{Wert}
                    </wann>
                    <wenn test="map.dateList.contains(key)">
                        TO_TIMESTAMP(#{Wert},'jjjj-MM-tt hh24:mi:ss')
                    </wann>
                    <sonst>
                        ${Wert}
                    </sonst>
                </wählen>
            </foreach>
            )
        </foreach>
    </sql>
 
    <!-- Stapelaktualisierung einfügen -->
    <insert id="batchInsertOrUpdate" parameterType="java.util.HashMap">
        <include refid="batchInsertSql"></include>
        zum Thema Konflikte (
        Dateiname, Tabellen-ID
        <if test="karte.tableInfo.flag">
            , "ID-Nummer"
        </if>
        ) aktualisieren
        Satz
        "table_id" = ausgeschlossen."table_id",
        "Dateiname" = ausgeschlossen."Dateiname",
        "create_time" = ausgeschlossen."create_time",
        <foreach-Sammlung="map.list.get(0)" index="Schlüssel" Trennzeichen=",">
            "${key}" = ausgeschlossen."${key}"
        </foreach>
    </einfügen>
</mapper>

V. InsertOrUpdate-Codebeispiel in MySQL

1. Tabellenanweisung erstellen

Tabelle „t_user“ erstellen (
  `Benutzername` varchar (255) Zeichensatz utf8 COLLATE utf8_general_ci NOT NULL,
  `Passwort` varchar (255) Zeichensatz utf8 COLLATE utf8_general_ci NOT NULL,
  `Alter` int(0) NULL DEFAULT NULL,
  `Adresse` varchar (255) Zeichensatz utf8 Sortiert utf8_general_ci NULL Standard NULL,
  `create_time` datetime(0) NULL DEFAULT NULL,
  `update_time` datetime(0) NULL DEFAULT NULL,
  `version` int(0) NICHT NULL,
  EINZIGARTIGER INDEX `user_union_index`(`Benutzername`, `Passwort`, `Alter`) MIT BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamisch;

2. Gewöhnliche Methode

INSERT INTO t_user
(Benutzername, Passwort, Alter, Erstellungszeit) 
WERTE('Jetzt' ,'123456',18,JETZT())
BEIM UPDATE FÜR DUPLIZIERTE SCHLÜSSEL 
Benutzername='Benutzername',
Passwort='123456',
erstelle_zeit=jetzt()

3. BEIM UPDATE DES DOPPELTEN SCHLÜSSELS

„Insert into“ bei doppeltem Schlüsselupdate bedeutet Einfügen und Aktualisieren von Daten. Wenn der Datensatz einen Primärschlüssel oder einen eindeutigen Index enthält und die Datenbank bereits Daten enthält, wird sie mit den neuen Daten aktualisiert. Wenn keine Daten vorhanden sind, ist der Effekt derselbe wie bei „Insert into“.

INSERT INTO t_user 
(Benutzername, Passwort, Alter, Erstellungszeit, Aktualisierungszeit, Version)
WERTE('zs','123',10,jetzt(),jetzt(),1) 
,( 'ls' ,'123456',20,jetzt(),jetzt(),1) 
,( 'ww' ,'123',30,jetzt(),jetzt(),1) 
BEIM UPDATE FÜR DUPLIZIERTE SCHLÜSSEL 
Benutzername= WERTE(Benutzername)
,Passwort=VALUES(Passwort)
, Alter = WERTE (Alter)
,Aktualisierungszeit=WERTE(Aktualisierungszeit)
,Version = Version + 1

4. Ersetzen durch

„Ersetzen in“ bedeutet das Einfügen und Ersetzen von Daten. Wenn der Datensatz einen Primärschlüssel oder einen eindeutigen Index enthält und die Datenbank bereits Daten enthält, werden diese durch die neuen Daten ersetzt (zuerst löschen und dann einfügen). Wenn keine Daten vorhanden sind, ist der Effekt derselbe wie bei „Einfügen in“.

REPLACE INTO t_user 
(Benutzername, Passwort, Alter, Erstellungszeit, Aktualisierungszeit, Version) 
WERTE 
( 'zs' ,'123',10,jetzt(),jetzt(),1)

5. Fügen Sie IGNORE ein in

„insert ignore into“ bedeutet, Konflikte so weit wie möglich zu ignorieren und gewaltsam einzufügen.

INSERT IGNORE INTO t_user 
(Benutzername, Passwort, Alter, Erstellungszeit, Aktualisierungszeit, Version) 
WERTE 
( 'zs' ,'123',10,jetzt(),jetzt(),1) ,
('Nezha','123',30,jetzt(),jetzt(),2)

6. Zusammenfassung

Beim Einfügen in Werte oder Einfügen in eine Auswahl in Stapeln werden die Atomizität und Konsistenz der Transaktion eingehalten, es sollte jedoch auf das Sperrproblem beim Einfügen in eine Auswahl geachtet werden.
Sowohl „Ersetzen in“ als auch „Einfügen in“ bei doppelter Schlüsselaktualisierung können Batch-Einfügen und -Aktualisieren implementieren. Ob es sich um ein Aktualisieren oder Einfügen handelt, hängt davon ab, ob die pk- oder uk-Daten im Datensatz in der Tabelle vorhanden sind.

Wenn es vorhanden ist, dient Ersteres zum Löschen und dann zum Einfügen und Letzteres zum Aktualisieren.
„insert ignore into“ ignoriert viele Datenkonflikte und Einschränkungen und wird selten verwendet.

Dies ist das Ende dieses Artikels zur Implementierung von MySQL + PostgreSQL Batch Insert oder Update. Weitere Informationen zu MySQL + PostgreSQL Batch Insert oder Update finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Beheben Sie den Grund, warum die Aktualisierung der PostgreSQL-Datenbank langsam ist
  • Basierend auf PostgreSQL-Zeilensperre für Updatetests
  • Detaillierte Erklärung der Unterschiede zwischen PostgreSQL Batch-Update und Oracle
  • Quellcodeanalyse von UPDATE-Anweisungen in Postgres

<<:  Einige Gedanken und Erfahrungen zum Thema Gestaltung und Erstellung von Webseiten (Websites)

>>:  Detaillierte Erklärung des Linux-Kernel-Makros Container_Of

Artikel empfehlen

uniapp implementiert Datums- und Zeitauswahl

In diesem Artikelbeispiel wird der spezifische Co...

CSS-Tutorial: CSS-Attribut-Medientyp

Eines der wichtigsten Merkmale eines Stylesheets ...

Analysieren Sie das Arbeitsprinzip von Tomcat

SpringBoot ist wie eine riesige Python, die sich ...

So gehen Sie mit verstümmelten Zeichen in der MySQL-Datenbank um

In MySQL können in der Datenbank fehlerhafte Zeic...

Teilen Sie 13 grundlegende Syntax von Typescript

Inhaltsverzeichnis 1. Was ist Ts 2. Grundlegende ...

React implementiert Endlosschleifen-Scrollinformationen

In diesem Artikel wird der spezifische Code von R...

Mehrere Möglichkeiten zum Einfügen von SVG in HTML-Seiten

SVG (Scalable Vector Graphics) ist ein Bildformat...

Das WeChat-Applet implementiert einen Videoplayer, der einen Bullet-Screen sendet

In diesem Artikel wird der spezifische Code für d...

Webdesigner ist ein geeignetes Talent

<br />Es gibt keine Straße auf der Welt. Wen...

Zwei Implementierungscodes der programmgesteuerten Navigation mit Vue-Router

Zwei Möglichkeiten zum Navigieren auf der Seite D...

Installations- und Verwendungsschritte für Docker Compose

Inhaltsverzeichnis 1. Was ist Docker Compose? 2. ...

Gemeinsame Nutzung verschiedener Methoden zum Deaktivieren des Seitencaches

Heute bin ich beim Entwickeln auf eine Methode ge...