MySQLで論理SQLを置き換える際の落とし穴を回避する方法の詳細な説明

MySQLで論理SQLを置き換える際の落とし穴を回避する方法の詳細な説明

重複キーの置換と挿入の違い

置換の使用法

競合がない場合、挿入と同等となり、他の列のデフォルト値が使用されます。キー競合がある場合、自動インクリメント列が更新され、競合している列が置き換えられ、他の列のデフォルト値が使用されます。
Com_replaceは1を追加します
Innodb_rows_updatedは1を追加します

重複キーでの Insert into … の使用法

競合がない場合は挿入と同等です。他の列のデフォルト値がキーと競合する場合は、該当するフィールドの値のみ更新されます。
Com_insertは1を追加します
Innodb_rows_insertedが1増加する

実験的デモンストレーション

テーブル構造

テーブルhelei1を作成します(
id int(10) 符号なし NOT NULL AUTO_INCREMENT,
名前 varchar(20) NOT NULL DEFAULT ''
年齢 tinyint(3) unsigned NOT NULL デフォルト 0,
主キー(id)、
ユニークキー uk_name (名前)
)
エンジン=innodb AUTO_INCREMENT=1 
デフォルト文字セット=utf8;

テーブルデータ

[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 1 | 何磊 | 26 |
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
+----+-----------+-----+
セット内の 3 行 (0.00 秒)

使用法に置き換える

[email protected] (helei)> replace into helei1 (name) values('贺磊');
クエリは正常、2 行が影響を受けました (0.00 秒)
[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 0 |
+----+-----------+-----+
セット内の 3 行 (0.00 秒)
[email protected] (helei)> helei1 (name) の値('爱璇') に置き換えます。
クエリは正常、1 行が影響を受けました (0.00 秒)
[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 0 |
| 5 | アイシュアン | 0 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)

置換の使用法

キーの競合がない場合、replace into は insert と同等となり、他の列のデフォルト値が使用されます。

キーの競合が発生すると、自動増分列が更新されて競合する列が置き換えられ、残りの列はデフォルト値に設定されます。

重複キーに…を挿入:

[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 0 |
| 5 | アイシュアン | 0 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)
[email protected] (helei)> insert into helei1 (name,age) values('贺磊',0) on duplicate key update age=100;
クエリは正常、2 行が影響を受けました (0.00 秒)
[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 100 |
| 5 | アイシュアン | 0 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)
[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 100 |
| 5 | アイシュアン | 0 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)
[email protected] (helei)> insert into helei1 (name) values('爱璇') on duplicate key update age=120;
クエリは正常、2 行が影響を受けました (0.01 秒)
[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 100 |
| 5 | 愛軒 | 120 |
+----+-----------+-----+
セット内の 4 行 (0.00 秒)
[email protected] (helei)> 重複キーの helei1 (name) 値に ('存在しません') を挿入し、age=80 を更新します。
クエリは正常、1 行が影響を受けました (0.00 秒)
[email protected] (helei)> helei1 から * を選択します。
+----+-----------+-----+
| ID | 名前 | 年齢 |
+----+-----------+-----+
| 2 | シャオミン | 28 |
| 3 | シャオホン | 26 |
| 4 | 何磊 | 100 |
| 5 | 愛軒 | 120 |
| 8 | 存在しない | 0 |
+----+-----------+-----+
セット内の行数は 5 です (0.00 秒)

要約する

replace into の使用は、最初に削除操作を実行し、競合するキーが見つかった場合は挿入操作を実行することと同じです。指定されていない列にはデフォルト値が使用されます。これにより、自動増分主キーが変更されます。テーブルに外部キーがある場合、またはビジネス ロジックが主キーに依存している場合は、例外が発生します。したがって、重複キーには Insert into … を使用することをお勧めします。執筆時間が急ぎだったため、記事には多少の誤りや不正確な点が避けられません。不適切な点がありましたら、ご指摘、ご訂正をお願いいたします。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQLの論理アーキテクチャに関する深い理解
  • MYSQLストアドプロシージャ、つまり一般的な論理知識のポイントの要約
  • MySQL 上級学習ノート (パート 3): MySQL 論理アーキテクチャの紹介、MySQL ストレージ エンジンの詳細な説明
  • MySQLの実行原理、論理階層化、データベース処理エンジンの変更について詳しく説明します
  • Mysql論理アーキテクチャの詳細な説明
  • PHPを使用してMySqlデータベースにアクセスする論理操作と追加、削除、変更、チェックの例
  • MySql ストアド プロシージャの論理的判断と条件制御
  • MySQLはテーブルデータを復元するためにfrmファイルとibdファイルを使用します
  • MySQLはデータ復旧を実装するためにbinlogログを使用する
  • 時点に基づくMySQLクイックリカバリソリューション
  • MySQL5.7 mysqldump バックアップとリカバリの実装
  • MySQL 論理バックアップとリカバリ テストの概要

<<:  Nginx で https をアップグレードする方法

>>:  JavaScript における正規表現の実際的な応用の詳細な説明

推薦する

IE9 のネイティブ ページ互換性の問題に対する解決策についての簡単な説明

序文最近、クライアントのネイティブページを引き継ぎました。顧客は、ページが IE9 以降のバージョン...

XHTML CSS ページをプリンタ ページに変換する

以前は、Web ページのプリンタ対応バージョンを作成するには、印刷したときに見栄えがよくなるようにレ...

HTMLコードに基づく画像断片化読み込み機能の実装

今日は断片化された画像の読み込み効果を実装します。効果は次のとおりです。 これを 3 つのステップで...

Nginx 外部ネットワーク アクセス イントラネット サイト構成操作

背景:サイトはフロントエンドとバックエンドから分離されています: vue+springbootフロン...

Vueは複数の画像の追加、表示、削除を実装します

この記事では、Vueで複数の画像を追加、表示、削除するための具体的なコードを参考までに紹介します。具...

Docker イメージのローカル Elasticsearch ポート操作へのアクセス

dockerスタックによってデプロイされたイメージサービスを使用すると、イメージを入力した後、理論的...

vuex で履歴を実装するためのサンプルコード

私は最近、ユーザー操作を元に戻す、またはやり直す機能を備えたビジュアル操作プラットフォームを開発して...

Dockerを使用して外部からアクセス可能なMySQLを構築する詳細な説明

MySQL 8.0をインストールする docker run -p 63306:3306 -e MYS...

VueはOpenLayersを使用してTiandi MapとAmapを読み込み

目次1. 世界地図1. VueにOpenLayersをインストールする2. アマップ1. 世界地図1...

JavaScript 関数構文の説明

目次1. 通常の機能2. 矢印関数3. データパケットJSON 4. オブジェクト5. 約束6. 非...

Linux 名前空間ユーザーの詳細な説明

ユーザー名前空間は Linux 3.8 で追加された新しい名前空間で、ユーザー ID やグループ I...

docker を使用して Spring Boot をデプロイし、Skywalking に接続する方法

目次1. 概要1. スカイウォーキング入門2. スカイウォーキング建築3. スカイウォーキングはどの...

nginx 設定の場所の概要の場所の通常の書き込みと書き換えルールの書き込み

1. 場所の正規表現例を見てみましょう: 場所 = / { # 完全一致 / 、ホスト名の後に文字列...

Docker Alpine イメージのタイムゾーン問題に対する完璧な解決策

最近、Docker を使用して Java アプリケーションをデプロイしていたときに、タイムゾーンが間...

React NativeのstartReactApplicationメソッドの簡単な分析

今回は、 RNの起動処理を整理しました。最後のstartReactApplication比較的複雑で...