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

Detaillierte Schritte zur Installation und Konfiguration von MySQL 5.7

1. MySQL herunterladen 1. Melden Sie sich auf der...

Fünf Möglichkeiten zum Durchlaufen von Objekten in JavaScript Beispielcode

Inhaltsverzeichnis Vorbereiten Fünf Waffen für … ...

So ändern Sie die Standardspeicher-Engine in MySQL

MySQL-Speicher-Engine: Der MySQL-Server verwendet...

Das neueste beliebte Skript Autojs Quellcode-Sharing

Heute werde ich einen Quellcode mit Ihnen teilen,...

JS implementiert Karussell mit mehreren Tabs

Karussell-Animationen können das Erscheinungsbild...

So installieren Sie MySQL 8.0 und melden sich bei MySQL unter MacOS an

Folgen Sie dem offiziellen Tutorial, laden Sie da...

Hexadezimale Farbcodes (vollständig)

Rot und Pink und ihre Hexadezimalcodes. #990033 #...

So implementieren Sie Seitensprünge in einem Vue-Projekt

Inhaltsverzeichnis 1. Erstellen Sie ein Vue-CLI-S...

Anzeigen und Analysieren des MySQL-Ausführungsstatus

Wenn Sie den Eindruck haben, dass ein Problem mit...

JS-Implementierung eines Karussellbeispiels

In diesem Artikel wird der spezifische JS-Code zu...

Der Implementierungsprozess der ECharts Multi-Chart-Verknüpfungsfunktion

Wenn viele Daten angezeigt werden müssen, ist die...