MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介

ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、identity_id、名前。現在、ID 番号 identity_id と名前 name には重複したデータが多数存在しており、これらを削除する必要があり、有効なデータは 1 つだけ保持されます。

2. シミュレーション環境

1. MySQLデータベースにログインし、別のテストデータベースmysql_exerciseを作成します。

データベース mysql_exercise を作成します。文字セットは utf8 です。

2. ユーザーテーブルusersを作成する

テーブルユーザーを作成する(
					id int auto_increment 主キー、
					アイデンティティID varchar(20)
					名前varchar(20) nullではない
     );

3. テストデータを挿入する

ユーザーのvalues(0,'620616199409206512','张三')に挿入します。
						(0,'620616199409206512','张三'),
						(0,'62062619930920651X','李思'),
						(0,'62062619930920651X','李思'),
						(0,'620622199101206211','王五'),
						(0,'620622199101206211','王五'),
						(0,'322235199909116233','赵六');

これを複数回実行すると、より多くの重複データが生成されます。

4. 解決策

(1)ID番号と氏名でグループ化する。

(2)グループ化後の最大ID(または最小ID)を取得する。

(3)最大(または最小)ID以外のすべてのフィールドを削除します。

5.最初の試み(失敗!!!)

ID が含まれないユーザーから削除します (identity_id、name によってユーザー グループから max(id) を選択します)。

エラー:

1093 (HY000): FROM句で更新のターゲットテーブル「users」を指定することはできません

MYSQL では、最初にテーブルのレコードを選択し、次に同じ条件に従って同じテーブルのレコードを更新または削除することはできないためです。

解決策としては、エラーを回避するために、中間テーブルを介して再度 select によって得られた結果を選択することです。

この問題は MySQL でのみ発生し、MSSQL や Oracle では発生しません。

したがって、最初に括弧内の SQL ステートメントを取り出して、最大 (または最小) ID を最初に見つけることができます。

max_id を選択 (users グループから、identity_id、name によって max_id として max(id) を選択)。

すると、別のエラーが報告されました。 ! !

エラー 1248 (42000): すべての派生テーブルには独自のエイリアスが必要です

つまり、プロンプトには、各派生テーブルに独自のエイリアスが必要であると表示されます。

サブクエリを実行する場合、外部クエリは内部クエリをテーブルとして扱うため、内部クエリにエイリアスを追加する必要があります。

修正を続けます:

クエリで見つかった最大 (または最小 ID) の結果を新しいテーブルとして扱い、エイリアス t を指定して、t.mix_id をクエリします。

(users グループから identity_id,name によって max(id) を max_id として選択) から t.max_id を t として選択します。

最大 (または最小) ID は、次のように正常に見つかります。

6. 2回目の試み(成功!!!)

ID が含まれないユーザーから削除 (
		t.max_idを選択 
		(users グループから、identity_id、name によって max(id) を max_id として選択) を t として
		);

実行結果:

重複データは正常に削除され、最後に追加されたレコードのみが保持されます。同様に、最初に追加されたレコードを保持することもできます(つまり、各グループ内の最小のIDを除くすべてのレコードを削除します)

3. 知識の拡張1: データの更新

その他のシナリオ: ユーザーテーブル user_info で名前が空の文字列 ("") であるユーザーのステータスを "0" に変更する

user_info を更新し、user_id が (name='' である user_info から user_id を選択) のステータスを '0' に設定します。

次のエラーも報告されました:

FROM 句で更新のターゲット テーブル 'user_info' を指定することはできません

MYSQL では、最初にテーブルのレコードを選択し、その後同じ条件に従って同じテーブルのレコードを更新または削除することはできません。解決策は、中間テーブルを介して取得された結果を再度選択して、エラーを回避することです。
以下のどちらもOKです! ! !

user_infoを更新し、user_idが'0'の状態でstatus='0'を設定します。 
	 (user_id を (user_info から user_id を選択、name = '') t1 から選択);

次の例も受け入れられますが、若干の違いがあります。エイリアスには as があってもなくてもよく、t1.user_id は内部の user_id に直接対応できます。

user_infoを更新し、user_idが'0'の状態でstatus='0'を設定します。 
	(select t1.user_id from (select user_id from user_info where name='') as t1);

3.1 ステップごとの分析

(1)次のクエリ結果を中間テーブルとして使用します。

name='' の場合、user_info から user_id を選択します。

(2)中間テーブルを結果セットとして再度クエリします。

(name='' の場合、user_id を user_info から選択) から user_id を t として選択します。

(3)データの更新

user_infoを更新し、user_idが'0'の状態でstatus='0'を設定します。 
	(user_id を (user_info から name='' の user_id を選択) から t1 として選択);

4. 拡張演習: 重複データの削除

SQL クエリを記述して、Person テーブル内の重複する電子メール アドレスをすべて削除し、ID が最も小さいものだけを保持します。

+----+------------------+
| ID | メール |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+------------------+

Id はこのテーブルの主キーです。

たとえば、クエリを実行すると、上記の Person テーブルは次の行を返します。

+----+------------------+
| ID | メール |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
+----+------------------+

回答1:

ID が ( に含まれない Person から削除
	(からt.min_idを選択
		電子メールによる人物グループから min(Id) を min_id として選択します。
		)としてt
	);

回答2:

p1を削除 
	p1 としての人物、p2 としての人物 
		ここで、p1.Email=p2.Email かつ p1.Id > p2.Id です。

要約する

これで、MySQL データベース内の重複データを削除して 1 つだけ残す方法についての記事は終了です。MySQL 内の重複データを削除する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MyBatis バッチによる MySql データの挿入/変更/削除
  • 誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装
  • mysql5.7.33 で誤って ibdata ファイルを削除した後にデータを回復する方法
  • MySQL の大きなテーブルで大量のデータを一括削除する方法
  • MySQLがデータの削除を推奨しない理由
  • MySQL 内の数千万のデータを一括削除する Python スクリプト
  • MySQL のデータ削除とデータ テーブル メソッドの例
  • MySQL でデータを削除してもテーブル ファイルのサイズが変更されないのはなぜですか?
  • MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明
  • MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

<<:  簡単な手順で純粋な CSS3 で 3D 反転効果を実現

>>:  docker コマンド例外「権限が拒否されました」の解決方法

推薦する

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...

HTML タイトル属性をラップする方法

数日前にプログラムを書いていたとき、プロンプト情報 (TITLE) を新しい行で囲みたいと思いました...

HBuilderX で Tomcat 外部サーバーを設定して、JSP インターフェイスを表示および編集する方法の詳細な説明

1. 最初の方法は、ローカルのTomcatを起動してJSPを表示することです。 tomcatのweb...

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...

ソースコードから MySQL 8.0.20 をコンパイルしてインストールする詳細なチュートリアル

前回の記事では、次のことを紹介しました。 MySQL8.0.20 インストール チュートリアルとイン...

JS配列重複排除の詳細

目次1 テストケース2 JS配列重複排除4種類2.1 要素の比較2.1.1 二重層 for ループ比...

MySQL MVCCメカニズム原理の詳細な説明

目次MVCCとはMySQL ロックとトランザクション分離レベルMySQL 元に戻すログMVCCの実装...

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します...

Alibaba Cloudのセキュリティルール設定の詳細な説明

2日前、ダブル11ショッピングフェスティバルを利用して、Alibaba CloudでECS(サーバー...

MySQL デッドロックのトラブルシューティングの全プロセス記録

【著者】 Liu Bo: Ctrip テクニカル サポート センターのシニア データベース マネージ...

MySQL無料インストール版のパスワードの設定と変更に関するチュートリアル

ステップ 1: 環境変数を構成する (解凍パス: G:\mysql\mysql-5.7.21-win...

Linuxのファイル操作の知識ポイントを詳しく解説

ファイル操作に関連するシステムコール作成するint creat(const char *ファイル名,...

Linux で実行中のすべてのプロセスを表示する方法

ps コマンドを使用できます。プロセスの PID など、現在実行中のプロセスに関する関連情報を表示で...

カンマで区切られたmysqlの分割関数の実装

1: 文字列を区切るためのストアドプロシージャを定義する 区切り文字 $$ `mess`$$ を使う...

js キャンバスは検証コードを実装し、検証コード機能を取得します

この記事の例では、検証コードを作成して取得するためのjsキャンバスの具体的なコードを共有しています。...