今日仕事中に、ビジネス側から次のような質問をされました。テーブルがあり、一意のフィールドを追加する必要がありますが、現在このフィールドには重複した値がいくつかあります。良い解決策はありますか? 正直に言うと、この質問を初めて聞いたとき、私はどうすればよいか分かりませんでした。なぜなら、そのような要件に遭遇したことがなかったからです。繰り返しフィールドに一意性を設定する場合、フィールドは一意にできず、値が繰り返されるため、必然的にデータが失われます。そこで私は彼に詳細にニーズを尋ね、最終的にこのプロセスでは重複データを 1 つだけ保存する必要があり、ある程度のデータ損失は許容できることを知りました。重複フィールドはたまたま時間フィールドです。この場合、各時点でレコードが存在することを確認するだけで済みます。 これを聞いて、私は次のような方法を思いつきました。 1. テーブル データをバックアップし、distinct メソッドを使用してこのフィールドをフィルター処理してから、結合クエリを使用して他のフィールドを取得します。 2. テーブル データをバックアップし、クエリ テーブルを使用して重複値のある部分を記録し、統計を実行して、レコードの 1 つをランダムに保持します。 これら 2 つの方法に加えて、MySQL の下位バージョンでは、alter ignore table メソッドを使用する別の方法があります。この構文はほとんど使用されません。これをテストするために実験を行いました。 [email protected]:yeyztest 23:30:51>>テーブル test\G の作成を表示 ************************** 1. 行 **************************** 表: テスト テーブルの作成: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) デフォルト NULL, `score` int(11) NOT NULL, 主キー (`id`) ) エンジン=InnoDB AUTO_INCREMENT=12 デフォルト文字セット=utf8 セット内の 1 行 (0.00 秒) [email protected]:test 23:38:39>>test から * を選択します。 +----+------+-------+ | ID | 年齢 | スコア | +----+------+-------+ | 1 | 2 | 3 | | 2 | 2 | 3 | | 3 | 3 | 4 | | 4 | 4 | 5 | +----+------+-------+ セット内の 4 行 (0.00 秒) テーブルを作成し、重複レコードを挿入して、年齢フィールドに一意のインデックスを追加します。結果を見てみましょう。 [email protected]:test 23:38:43>>テーブルテストを変更し、一意のキー uni_key(age) を追加します。 エラー 1062 (23000): キー 'uni_key' のエントリ '2' が重複しています [email protected]:test 23:39:04>>テーブルテストを無視して変更し、一意のキー uni_key(age) を追加します。 エラー 1062 (23000): キー 'uni_key' のエントリ '2' が重複しています [email protected]:test 23:39:24>>@@old_alter_table=1 を選択します。 +---------------------+ | @@old_alter_table=1 | +---------------------+ | 0 | +---------------------+ セット内の 1 行 (0.00 秒) [email protected]:test 23:40:22>>old_alter_table=1 を設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) [email protected]:test 23:40:36>>テーブルテストを無視して変更し、一意のキー uni_key(age) を追加します。 クエリは正常、4 行が影響を受けました (0.04 秒) 記録: 4 重複: 1 警告: 0 [email protected]:test 23:40:39>>test から * を選択します。 +----+------+-------+ | ID | 年齢 | スコア | +----+------+-------+ | 1 | 2 | 3 | | 3 | 3 | 4 | | 4 | 4 | 5 | +----+------+-------+ セット内の 3 行 (0.00 秒) ご覧のとおり、最初に従来の直接変更方法を使用しました。つまり、alter table テスト メソッドが使用されました。競合するレコードが見つかった場合は、alter ignore メソッドを使用する必要があります。それでもエラーは残りました。クエリを実行した後、パラメータ old_alter_table が欠落していることがわかりました。重複レコードを正常に削除して一意のインデックスを追加するには、このパラメータを 1 に設定する必要があります。最終的に、結果が正常に達成されました。 ここで注意すべき点は、このテストの環境は MySQL5.5.19 であるということです。MySQL5.7 環境ではこのテストは失敗し、この構文は不正な構文としてマークされます。したがって、このメソッドは MySQL バージョン 5.5 でのみ使用できます。興味のある学生は、バージョン 5.6 で使用できるかどうかをテストできます。 もう 1 つ説明させてください。alter ignore table の本質は、新しいテーブルを作成することです。新しいテーブル構造の age フィールドは一意になります。次に、insert ignore 構文を使用してそれを挿入します。重複レコードが見つかった場合は、直接削除されます。したがって、この構文を使用する場合は、テーブル内のデータの量に注意してください。データ量が多い場合は、実行時間が非常に長くなる可能性があるため、注意して使用する必要があります。 今日はこれで終わりです。 上記は、MySQL alter ignore 構文の詳細な説明です。MySQL alter ignore 構文の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Docker を使用した war パッケージ プロジェクトのデプロイの実装
>>: 要素テーブルテーブルコンポーネントの複数フィールド(複数列)ソート方法
目次背景なぜエラー処理が必要なのでしょうか? async await より適切なエラー処理まとめ要約...
<br />ウェブサイトを科学的にデザインする: アイトラッキング研究から学ぶ 23 の...
目次1. クエリキャッシュの実装プロセス2. クエリキャッシュを構成する3. クエリキャッシュを有効...
今日、vue3+viteプロジェクトの実践で、svgを使用する場合、以前の記述方法が使用できないこと...
この記事では、例を使用して MySQL コード実行構造について説明します。ご参考までに、詳細は以下の...
効率的に要件を満たし、コンポーネント ライブラリの肥大化や車輪の再発明を避けるために、私は以前、大画...
フレックスレイアウトを使用すると、9つの正方形のグリッドであれば、図に示すように均等に分割できます。...
# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...
目次JSONとはなぜこの技術なのでしょうか? JSONの使い方- データ形式- メモ- JSには2つ...
目次1. 数字を逆にする2. 配列内の最大のn個の数値を取得する3. 階乗を計算する4. 現在の動作...
フロントエンド開発者の必須科目であるCSS3は、多くの基本的なアニメーション効果を実現するのに役立ち...
MySQL データベースを使用する際、何らかの理由で長期間 MySQL にログインしていない場合、ま...
この記事では、Webページの画像の回転を実現するためのjsの具体的なコードを参考までに共有します。具...
目次1. デザインパターンとは何ですか? 2. デザインパターンの5つの設計原則(SOLID) 3....
この記事では、テーブルの作成、フィールドの追加、フィールドの変更、インデックスの追加を行う一般的な ...