So vermeiden Sie die Duplizierung von Daten beim Einfügen in einen MySql-Batch

So vermeiden Sie die Duplizierung von Daten beim Einfügen in einen MySql-Batch

Vorwort

Mysql fügt nicht duplizierte Daten ein. Wenn eine große Datenmenge eingefügt werden muss, muss ermittelt werden, ob die Einfügung wiederholt wird, und dann muss sie eingefügt werden. Wie kann also die Effizienz verbessert werden? Es gibt viele Möglichkeiten, das Problem zu lösen, und die Lösungen sind je nach Szenario unterschiedlich. Bei kleinen Datenmengen ist jede Lösung in Ordnung, bei großen Datenmengen ist das Problem jedoch nicht einfach.

1. füge ignore ein in

Die bereits in der Datenbank vorhandenen Daten werden ignoriert. Wenn keine Daten in der Datenbank vorhanden sind, werden neue Daten eingefügt. Wenn Daten vorhanden sind, werden die aktuell eingefügten Daten übersprungen. Auf diese Weise können die vorhandenen Daten in der Datenbank beibehalten und der Zweck des Einfügens von Daten in die Lücke erreicht werden.

Controller-Methode:

/**
 *Mitarbeiterdaten einfügen*/
@PostMapping("speichern")
@AntwortBody
öffentliche CommonResult<Mitarbeiter> speichern(@RequestBody Mitarbeiter Mitarbeiter) {
    returniere employeeService.saveEmp(Mitarbeiter);
}
EINFÜGEN IN
<!--Mitarbeiterdaten einfügen-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    INSERT INTO t_employee(id, Name, Alter, Gehalt, Abteilungs-ID)
    WERTE (#{id},#{name},#{alter},#{gehalt},#{abteilungs-ID})
</einfügen> 

Bildbeschreibung hier einfügen

Wir fügen einen neuen Mitarbeiterdatensatz mit der Primärschlüssel-ID 1 hinzu.

Wenn ich die Anfrage erneut sende, wird ein Ausführungsfehler der SQL-Anweisung gemeldet, da der Primärschlüssel eindeutig ist und der Datensatz mit der ID=1 bereits vorhanden ist.

Bildbeschreibung hier einfügen

Ignorieren hinzufügen und einen weiteren Mitarbeiterdatensatz mit der ID=1 hinzufügen

IGNORE EINFÜGEN IN 

Bildbeschreibung hier einfügen

Es ist kein Fehler aufgetreten, aber die Hinzufügung war nicht erfolgreich und die Hinzufügung doppelter Daten wurde ignoriert.

2. bei doppeltem Schlüssel-Update

Bei Wiederholung des Primärschlüssels oder eindeutigen Schlüssels wird eine Aktualisierungsanweisung ausgeführt.

 BEIM UPDATE EINES DOPPELTEN SCHLÜSSELS id = id

Wir fügen dennoch den Mitarbeiterdatensatz mit der ID=1 ein und ändern die anderen Felder (Alter=25):

Bildbeschreibung hier einfügen

Datenbankeinträge anzeigen:

Bildbeschreibung hier einfügen

Sie können sehen, dass es keine Änderung gibt, nur ein Datenelement vorhanden ist und eine erfolgreiche Eingabeaufforderung zurückgegeben wird.

Diese Methode hat eine Voraussetzung, d. h. die einzufügende Einschränkung muss ein Primärschlüssel oder eine eindeutige Einschränkung sein (in Ihrem Unternehmen sollte das Feld, das als einziges Urteil verwendet werden muss, als eindeutige Einschränkung, d. h. als eindeutiger Schlüssel, festgelegt werden).

Erweiterung: Diese Methode erfüllt auch die Anforderungen anderer Geschäftsszenarien ->>> Aktualisieren Sie andere Felder regelmäßig.

Wir fügen der Mitarbeitertabelle ein Zeitfeld hinzu:

privates Datum, Aktualisierungszeit; 

Bildbeschreibung hier einfügen

Dann fügen wir Daten entsprechend dem Feld updateTime ein:

<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    INSERT INTO t_employee(id, Name, Alter, Gehalt, Abteilungs-ID, Aktualisierungszeit)
    WERTE (#{id},#{name},#{age},#{gehalt},#{abteilungs-ID},jetzt())
    BEIM UPDATE EINES DOPPELTEN SCHLÜSSELS update_time = now()
</einfügen>

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Was muss ich tun, wenn ich beim Einfügen andere Felder (z. B. das Alter) aktualisieren muss?

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

3. ersetzen durch

Wenn Datensätze mit demselben Primär- oder Eindeutigkeitswert vorhanden sind, löschen Sie diese zuerst. Neue Datensätze erneut einfügen.

Ersetzen in
 <!--Mitarbeiterdaten einfügen-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
    REPLACE INTO t_employee(id, Name, Alter, Gehalt, Abteilungs-ID, Aktualisierungszeit)
    WERTE (#{id},#{name},#{age},#{gehalt},#{abteilungs-ID},jetzt())
</einfügen>

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Zusammenfassung: In der tatsächlichen Entwicklung wird am häufigsten die zweite Methode verwendet, nämlich die Batch-Addition.

<!--Mitarbeiterdaten einfügen-->
<insert id="saveEmp" parameterType="java.util.List">
    INSERT INTO t_employee(id, Name, Alter, Gehalt, Abteilungs-ID, Aktualisierungszeit)
    WERTE
    <foreach Sammlung="Liste" Element="Element" Index="Index" Trennzeichen=",">
        (#{item.id},#{item.name},#{item.age},#{item.salary},#{item.departmentId},jetzt())
    </foreach>
    BEI DUPLIZIERTER SCHLÜSSELAKTUALISIERUNG id = id
</einfügen>

Regler:

@PostMapping("speichern")
@AntwortBody
öffentliche CommonResult<Mitarbeiter> speichern(@RequestBody List<Mitarbeiter> employeeList) {
    gibt employeeService.saveEmp(employeeList) zurück;
}

Bildbeschreibung hier einfügen

Wenn die gleiche ID bereits vorhanden ist, wird sie nicht mehrfach hinzugefügt.

Zusammenfassen

In der Praxis wird am häufigsten Methode 2 verwendet. Je nach Szenario kommen unterschiedliche Methoden zum Einsatz.

Dies ist das Ende dieses Artikels zum Einfügen von Daten ohne Duplikate während der MySql-Batch-Einfügung. Weitere relevante Inhalte zum Einfügen von MySql ohne Duplikate finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • MySQL verwendet UNIQUE, um das Einfügen nicht doppelter Daten zu implementieren

<<:  Eine kurze Diskussion über das Design des Tomcat-Mehrschichtcontainers

>>:  Frage zu benutzerdefinierten Attributen von HTML-Tags

Artikel empfehlen

Verwenden einer MySQL-Datenbank im Docker, um LAN-Zugriff zu erhalten

1. Holen Sie sich das MySQL-Image Docker-Pull MyS...

Werbefähigkeiten im Baidu Union-Umfeld (grafisches Tutorial)

Kürzlich haben Studierende des User Experience-Tea...

Vue implementiert QR-Code-Scanfunktion (mit Stil)

brauchen: Verwenden Sie Vue, um das Scannen von Q...

JavaScript-Entwurfsmuster, Lernadaptermuster

Inhaltsverzeichnis Überblick Code-Implementierung...

Lösen Sie schnell das Problem der chinesischen Eingabemethode unter Linux

Hintergrund: Ich arbeite derzeit an Funktionen fü...

Installations- und Konfigurationstutorial von MongoDB unter Linux

MongoDB -Installation Wählen Sie die Installation...

Beispiel-Tutorial für geplante MySQL-Aufgaben

Vorwort Seit MySQL 5.1.6 wurde eine einzigartige ...

Detaillierte Erklärung der Datenmengen von Docker-Containern

Was ist Schauen wir uns zunächst das Konzept von ...

Analyse langsamer Einfügefälle aufgrund großer Transaktionen in MySQL

【Frage】 Die INSERT-Anweisung ist eine der am häuf...

Implementierung einer benutzerdefinierten Vue-Vorlage von vscode

Verwenden Sie den Vscode-Editor, um eine Vue-Vorl...

So installieren Sie eine MySQL-Datenbank unter Ubuntu

Ubuntu ist ein kostenloses und quelloffenes Deskt...