MySQL-Datenbank löscht doppelte Daten und behält nur eine Methodeninstanz bei

MySQL-Datenbank löscht doppelte Daten und behält nur eine Methodeninstanz bei

1. Problemeinführung

Nehmen Sie ein Szenario an, in dem eine Benutzertabelle 3 Felder enthält. ID, Identitäts-ID, Name. Jetzt gibt es viele doppelte Daten für die ID-Nummer „identity_id“ und den Namen „name“, die gelöscht werden müssen, und nur ein gültiger Wert bleibt erhalten.

2. Simulationsumgebung

1. Melden Sie sich bei der MySQL-Datenbank an und erstellen Sie eine separate Testdatenbank mysql_exercise

Datenbank mysql_exercise-Zeichensatz utf8 erstellen;

2. Erstellen Sie die Benutzertabelle users

Tabelle „Benutzer“ erstellen (
					id int auto_increment Primärschlüssel,
					Identitäts-ID varchar(20),
					Name varchar(20) nicht null
     );

3. Testdaten einfügen

in Benutzerwerte einfügen (0, „620616199409206512“, „null“),
						(0,'620616199409206512','Alle'),
						(0,'62062619930920651X','Li Si'),
						(0,'62062619930920651X','Li Si'),
						(0,'620622199101206211','Nein'),
						(0,'620622199101206211','Nein'),
						(0,'322235199909116233','Gutschein');

Sie können es mehrmals ausführen, um mehr doppelte Daten zu generieren.

4. Lösung

(1) Gruppieren nach ID-Nummer und Name;

(2) Holen Sie sich die maximale ID (oder minimale ID) nach der Gruppierung.

(3) Löschen Sie alle Felder außer der maximalen (oder minimalen) ID.

5. Erster Versuch (fehlgeschlagen!!!)

Löschen Sie Benutzer, bei denen die ID nicht vorhanden ist (wählen Sie max(id) aus der Benutzergruppe nach Identitäts-ID, Name aus);

Fehler:

1093 (HY000): Sie können die Zieltabelle „Benutzer“ für die Aktualisierung nicht in der FROM-Klausel angeben

Denn in MySQL können Sie nicht zuerst die Datensätze einer Tabelle auswählen und dann die Datensätze derselben Tabelle gemäß denselben Bedingungen aktualisieren oder löschen.

Die Lösung besteht darin, das durch erneutes Auswählen erhaltene Ergebnis über die Zwischentabelle auszuwählen, um den Fehler zu vermeiden.

Dieses Problem tritt nur in MySQL auf, nicht in MSSQL und Oracle.

Daher können wir zuerst die SQL-Anweisung in den Klammern herausnehmen und zuerst die maximale (oder minimale) ID finden.

Wählen Sie max_id aus (wählen Sie max(id) als max_id aus der Benutzergruppe nach Identitäts-ID, Name);

Dann wurde ein weiterer Fehler gemeldet! ! !

FEHLER 1248 (42000): Jede abgeleitete Tabelle muss einen eigenen Alias ​​haben

Das heißt: Die Eingabeaufforderung besagt, dass jede abgeleitete Tabelle einen eigenen Alias ​​haben muss!

Bei der Ausführung einer Unterabfrage behandelt die äußere Abfrage die innere Abfrage als Tabelle, daher müssen wir der inneren Abfrage einen Alias ​​hinzufügen

Weiter zur Korrektur:

Behandeln Sie das in der Abfrage gefundene maximale (oder minimale ID-)Ergebnis als neue Tabelle, geben Sie ihm den Alias ​​t und fragen Sie t.mix_id ab.

Wählen Sie t.max_id aus (wählen Sie max(id) als max_id aus der Benutzergruppe nach Identitäts-ID, Name) als t;

Die maximale (oder minimale) ID kann erfolgreich wie unten gezeigt gefunden werden:

6. Zweiter Versuch (Erfolg!!!)

Löschen von Benutzern, deren ID nicht in (
		wähle t.max_id aus 
		(wählen Sie max(id) als max_id aus der Benutzergruppe nach identity_id,name) als t
		);

Ausführungsergebnis:

Die doppelten Daten werden erfolgreich gelöscht und nur der zuletzt hinzugefügte Datensatz bleibt erhalten. Ebenso können Sie den ersten hinzugefügten Datensatz behalten (d. h. alle Datensätze außer der kleinsten ID in jeder Gruppe löschen).

3. Wissenserweiterung 1: Daten aktualisieren

Andere Szenarien: Um den Status von Benutzern, deren Name eine leere Zeichenfolge ("") ist, in der Benutzertabelle user_info auf "0" zu ändern

Benutzerinformationen aktualisieren, Status auf „0“ setzen, wobei Benutzer-ID in (Benutzer-ID aus Benutzerinformationen auswählen, wobei Name „“ ist)

Außerdem wurde der folgende Fehler gemeldet:

Sie können die Zieltabelle „user_info“ für die Aktualisierung nicht in der FROM-Klausel angeben

Denn in MySQL können Sie nicht zuerst die Datensätze einer Tabelle auswählen und dann die Datensätze derselben Tabelle unter denselben Bedingungen aktualisieren oder löschen. Die Lösung besteht darin, die über die Zwischentabelle erhaltenen Ergebnisse erneut auszuwählen und so Fehler zu vermeiden.
Beides ist akzeptabel! ! !

aktualisiere user_info setze status='0' wobei user_id in 
	 (Wählen Sie die Benutzer-ID aus (Wählen Sie die Benutzer-ID aus Benutzerinfo, wobei Name = '') t1);

Das folgende Beispiel ist ebenfalls akzeptabel, mit einem kleinen Unterschied: Der Alias ​​kann „as“ haben oder nicht, und t1.user_id kann direkt der inneren Benutzer-ID entsprechen.

aktualisiere user_info setze status='0' wobei user_id in 
	(wählen Sie t1.user_id aus (wählen Sie user_id aus user_info, wobei name='') als t1);

3.1 Schrittweise Analyse

(1) Verwenden Sie die folgenden Abfrageergebnisse als Zwischentabelle:

Wählen Sie die Benutzer-ID aus den Benutzerinformationen, wobei Name = „“ ist.

(2) Fragen Sie die Zwischentabelle erneut als Ergebnismenge ab:

Wählen Sie die Benutzer-ID aus (Wählen Sie die Benutzer-ID aus Benutzerinfo, wobei Name = „“) als t;

(3) Daten aktualisieren

aktualisiere user_info setze status='0' wobei user_id in 
	(Wählen Sie die Benutzer-ID aus (Wählen Sie die Benutzer-ID aus Benutzerinfo, wobei Name='') als t1);

4. Zusatzübung: Löschen doppelter Daten

Schreiben Sie eine SQL-Abfrage, um alle doppelten E-Mail-Adressen in der Personentabelle zu löschen und nur die Adresse mit der kleinsten ID zu behalten.

+----+------------------+
| ID | E-Mail |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+------------------+

Die ID ist der Primärschlüssel dieser Tabelle.

Beispielsweise sollte die obige Personentabelle nach dem Ausführen Ihrer Abfrage die folgenden Zeilen zurückgeben:

+----+------------------+
| ID | E-Mail |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
+----+------------------+

Antwort 1:

Löschen von Person, bei der die ID nicht vorhanden ist (
	wähle t.min_id aus (
		Wählen Sie min(Id) als min_id aus der Personengruppe per E-Mail
		) als t
	);

Antwort 2:

lösche p1 aus 
	Person als P1, Person als P2 
		wobei p1.Email=p2.Email und p1.Id > p2.Id;

Zusammenfassen

Damit ist der Artikel zum Löschen doppelter Daten in einer MySQL-Datenbank und zum Behalten nur eines abgeschlossen. Weitere Informationen zum Löschen doppelter Daten in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • MyBatis Batch-Einfügen/Ändern/Löschen von MySql-Daten
  • Implementierung von MySQL mit dem Befehl mysqlbinlog zum Wiederherstellen versehentlich gelöschter Daten
  • So stellen Sie Daten wieder her, nachdem Sie versehentlich IBData-Dateien in MySQL 5.7.33 gelöscht haben
  • So implementieren Sie die Stapellöschung großer Datenmengen in großen MySQL-Tabellen
  • Warum MySQL das Löschen von Daten nicht empfiehlt
  • Python-Skript zum Batch-Löschen von zig Millionen Daten in MySQL
  • Beispiel für die MySQL-Methode zum Löschen von Daten und Datentabellen
  • Warum die Tabellendateigröße nach dem Löschen von Daten in MySQL unverändert bleibt
  • Detaillierte Erläuterung mehrerer praktischer Lösungen zum schnellen Löschen großer Datenmengen (zig Millionen) in MySQL
  • Warum der Speicherplatz nach dem Löschen von Daten in MySQL nicht freigegeben wird

<<:  Erzielen Sie mit reinem CSS3 in wenigen einfachen Schritten einen 3D-Flip-Effekt

>>:  Lösung für die Docker-Befehlsausnahme „Zugriff verweigert“

Artikel empfehlen

Eine detaillierte Einführung in den Ausführungsmechanismus von JavaScript

Inhaltsverzeichnis 1. Das Konzept von Prozess und...

Einführung in die Apache-Bereitstellung von https in der Kryptografie

Inhaltsverzeichnis Zweck Experimentelle Umgebung ...

Analyse des Unterschieds zwischen absolutem und relativem Pfad in HTML

Wie in der Abbildung gezeigt: Mit einer einzelnen ...

Vue realisiert einen dynamischen Fortschrittsbalkeneffekt

In diesem Artikelbeispiel wird der spezifische Co...

Beispielcode eines CSS-responsiven Layoutsystems

Responsive Layoutsysteme sind in den heute gängig...

JavaScript zur Implementierung des Flugzeugkriegsspiels

In diesem Artikel erfahren Sie, wie Sie mit Canva...

Codebeispiele für allgemeine Docker-Datenvolumenvorgänge

Wenn der Entwickler Dockerfile zum Erstellen des ...

Zwei Methoden der MySql-Kommaverkettungs-Stringabfrage

Die folgenden beiden Funktionen werden auf die gl...

Interaktion im Webdesign: Eine kurze Diskussion über Paging-Probleme

Funktion: Zur vorherigen Seite oder zur nächsten ...

Eine kurze Analyse der vier Importmethoden und Prioritäten in CSS

Erstens: 4 Möglichkeiten, CSS einzuführen Es gibt...

Lösen Sie das Spleißproblem beim Löschen von Bedingungen in myBatis

Ich habe heute gerade Mybatis gelernt und einige ...