MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を例を使って説明します。ご参考までに、詳細は以下の通りです。

データ移行では、多くの場合、2 つのテーブルを比較して、一方のテーブルに、もう一方のテーブルに対応するレコードがないレコードを識別する必要があります。

たとえば、古いデータベースとは異なるスキーマを持つ新しいデータベースがあるとします。私たちの仕事は、古いデータベースから新しいデータベースにすべてのデータを移行し、データが正しく移行されたことを確認することです。データをチェックするには、新しいデータベースと古いデータベースの 2 つのテーブルを比較し、一致しないレコードを特定する必要があります。

t1 と t2 という 2 つのテーブルがあるとします。次の手順で 2 つのテーブルを比較し、一致しないレコードを特定します。一般的な考え方は、最初に t1 をチェックし、次にデータ結果セットをループして、他のテーブルを 1 つずつクエリすることです。データが見つかった場合、そのデータは正しいです。見つからない場合、データが欠落しています。

もしこれが本当なら、あなたは本当に若すぎて単純すぎるのです。今回は、union all を使用して 2 つのテーブルを結合し、一時テーブルまたは派生テーブルを使用してデータを比較するという、より簡単なデータ比較ソリューションを紹介します。 union all の SQL の例を見てみましょう。

t1.pk、t1.c1を選択します。
t1から
ユニオンオール
t2.pk、t2.c1を選択します。
t2から

その後、2 つのテーブルを作成し、データを挿入します。その後、テストを行うことができます。まずはテーブルの作成方法を見てみましょう。

テーブルt1を作成します(
 id int auto_increment 主キー、
  タイトルvarchar(255) 
);
テーブルt2を作成します(
 id int auto_increment 主キー、
  タイトルvarchar(255)、
  メモvarchar(255)
);

その後、t1 にデータを挿入します。

t1(タイトル)に挿入
VALUES('行1'),('行2'),('行3');

t2 にデータを挿入してみましょう:

t2(タイトル)に挿入
VALUES('行1'),('行2'),('行3');

では、派生テーブルを使用してデータを比較してみましょう。

SELECT id,タイトル
から (
  t1からid、titleを選択
  ユニオンオール
  t2からid、titleを選択
) 表
GROUP BY id、タイトル
count(*) = 1 である
ID で並べ替える;

もちろん、それらの間に違いはないので、実行後に返されるデータはありません。心配しないでください。t2 テーブルに別のデータ行を挿入しましょう。

t2(タイトル、メモ)に挿入
VALUES('新しい行4','新しい');

その後、2つのテーブルのタイトル列の値を再度比較します。新しい行は一致しない行なので、それが返されます。結果を見てみましょう。

mysql> SELECT id,title
から (
  t1からid、titleを選択
  ユニオンオール
  t2からid、titleを選択
) 表
GROUP BY id、タイトル
count(*) = 1 である
ID で並べ替える;
+----+-----------+
| ID | タイトル |
+----+-----------+
| 4 | 新しい行 4 |
+----+-----------+
セット内の1行

さて、今回のヒントは以上です。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL の 2 つのテーブル ストレージ構造 MyISAM と InnoDB のパフォーマンス比較テスト
  • MySQL の異なるデータベースの異なるテーブルからデータをインポートする
  • MySQLテーブル内の重複レコードを見つける
  • MySQLでテーブルデータを削除する方法
  • データベースを削除せずにMySQLのすべてのテーブルを素早く削除する方法
  • MySQLテーブル内の重複データをクエリする方法
  • PHP で MySQL テーブルのフィールド名と詳細情報を取得する方法
  • MySQLデータテーブルフィールドの内容に対するバッチ変更、クリア、コピー、その他の更新コマンド
  • MySQLデータベーステーブルを素早くコピーする方法
  • MySQLは、SELECT文を使用して、指定されたテーブルの指定された列(フィールド)のデータを照会します。
  • MYSQLデータベースの既存のテーブルに新しいフィールド(列)を追加する
  • MySQL で、すべてのデータベースが占有するディスク容量と、単一データベース内のすべてのテーブルのサイズを照会する SQL ステートメント

<<:  VScode リモート SSH リモート編集とデバッグコード

>>:  すべてまたは逆の選択機能を実現するJavaScript

推薦する

Vue で eslint 検出をオフにする方法 (複数の方法)

目次1. 問題の説明2. 問題解決1. 問題の説明Vue プロジェクトを開発する場合、作成時に誤って...

Dockerコンテナ内の設定ファイルの変更の実装

1. コンテナに入るdocker run [オプション] イメージ名 [起動コンテナに渡されるコマン...

Linux カーネル デバイス ドライバー Linux カーネル 基本メモの概要

1. Linuxカーネルドライバモジュールの仕組み静的ロードでは、ドライバモジュールをカーネルにコン...

Vue3ルーティングVueRouter4を使用する簡単な例

ルーティングvue-router4 では API の大部分は変更されていないため、変更点のみに焦点を...

CSS 3D からソースコードによる空間座標軸へ

かつて、サイコロを振るゲームについて話しました。その時は、steps 属性 + スプライト画像を使用...

MySql クイック挿入数千万の大規模データの例

データ分析の分野では、データベースは私たちの強力な助けとなります。クエリ時間を受け入れるだけでなく、...

DBeaver を MySQL バージョン 8 以降に接続し、起こりうる問題を解決する方法の詳細な説明

データベース MySQL バージョン 8.0.18 DBeaver.exeをダウンロードするダウンロ...

Docker 自動ビルド 自動ビルド実装プロセス図

自動ビルドとは、Docker Hub を使用して、Dockerfile ファイルを含む GitHub...

JavaScriptの原理と方向性

これが何を指しているのかをどのように判断するのでしょうか? ①グローバル環境で呼び出された場合はwi...

Dockerコンテナのディスクがいっぱいになった場合の状況のまとめ

序文この記事では、最近私が遭遇した 2 つの状況について説明します。今後、新たな発見があれば追加して...

Tomcatでcatalina.batがUTF-8に設定されている場合、コンソールに文字化けした文字が表示されます

1. catalina.bat は UTF-8 に設定する必要があります。UTF-8 に設定しないと...

インターフェースなしで Centos7 に JDK と Tomcat をデプロイするチュートリアル

1. xshell6をインストールする2. サーバー接続を作成し、ユーザー名とパスワードを入力します...

MySQL 10進数符号なし更新負数を0に変換

今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプ...

HTML マーキータグの使用例

このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルのみをサポートしています。そのため、...

CSS 要素で計算されたスタイルを取得します (カスケード/最終スタイル後)

CSS 要素内の計算されたスタイル (つまり、カスケード後の最終的なスタイル) を取得するには、W3...