MySQLの主キーとユニークキーの重複挿入の解決策の詳細な説明

MySQLの主キーとユニークキーの重複挿入の解決策の詳細な説明

データを挿入するときに、重複したデータを挿入するという問題が発生する可能性がありますが、これらのデータには重複した値が許可されていません。

テーブル stuInfo を作成します (
  id INT NOT NULL COMMENT 'シリアル番号',
  名前 VARCHAR(20) NOT NULL デフォルト '' COMMENT '名前',
  age INT NOT NULL DEFAULT 0 COMMENT '年齢',
  主キー (id)、
  ユニークキー uniq_name(name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='student table';
mysql> stuInfo に INSERT INTO (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25),(2,'aa',24);
エラー 1062 (23000): キー 'PRIMARY' のエントリ '1' が重複しています

解決:

1. 無視する

ignore を使用すると、挿入された値が重複する主キー (PRIMARY KEY) または一意キー (UNIQUE KEY) に遭遇したときに、後続のレコードの挿入に影響を与えずに重複レコードを自動的に無視できます。

stuInfo (name,birthday,is_deleted) に IGNORE を挿入します。VALUES ('yoona','1990-01-05',0),('aa','1990-01-16',0),('bb','1990-01-17',0);

実行結果:

mysql> INSERT IGNORE INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25),(2,'aa',24);
クエリは正常、2 行が影響を受けました (0.02 秒)
記録: 3 重複: 1 警告: 0
mysql> stuInfo から * を選択します。 
+----+-------+-----+
| ID | 名前 | 年齢 |
+----+-------+-----+
| 1 | ユナ | 20 |
| 2 | 単3 | 24 |
+----+-------+-----+
セット内の 2 行 (0.00 秒)

実行結果から、影響を受けるのは 2 行のみであることがわかります。つまり、(1,'yoona',20) のデータが挿入され、(1,'xiaosi',25) の重複データは自動的に無視され、(2,'aa',24) の重複しないデータは引き続き挿入され、重複データの影響を受けません。

2. 交換

重複する主キーまたは一意のキーを持つレコードを replace を使用して挿入する場合は、挿入する前にテーブル内の重複レコードを削除します。

mysql> REPLACE INTO stuInfo (name,birthday,is_deleted) VALUES ('yoona','1990-01-15',0),('yoona','1990-02-16',0),('aa','1990-01-13',0);
クエリは正常、4 行が影響を受けました (0.02 秒)
記録: 3 重複: 1 警告: 0
実行結果:
 
mysql> stuInfo から * を選択します。 +----+-------+------------+------------+
| ID | 名前 | 誕生日 | 削除済み |
+----+-------+------------+------------+
| 21 | ユナ | 1990-02-16 | 0 |
| 22 | 単行本 | 1990-01-13 | 0 |
+----+-------+------------+------------+
セット内の 2 行 (0.00 秒)

出力情報から、4 行が影響を受けていることがわかります。つまり、最初に ('yoona','1990-01-15',0) が挿入され、次に ('yoona','1990-01-15',0) が削除されたことを意味します。

3. 重複キーの更新について

挿入されたレコードが重複する主キーまたは一意キーに遭遇すると、後で定義された UPDATE 操作が実行されます。これは、最初に挿入操作を実行し、次に主キーまたは一意キーに基づいて更新操作を実行することと同じです。

stuInfo が存在する場合はテーブルを削除します。
テーブル stuInfo を作成します (
  id INT NOT NULL COMMENT 'シリアル番号',
  名前 VARCHAR(20) NOT NULL デフォルト '' COMMENT '名前',
  age INT NOT NULL DEFAULT 0 COMMENT '年齢',
  主キー (id)、
  ユニークキー uniq_name(name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='student table';

ON DUPLICATE KEY UPDATE 後の VALUES の説明:

VAULES(age)は挿入するレコードの値を参照します

年齢はテーブル自体の値、つまり挿入された値を参照します。

(1)第一のシナリオ:

#VALUES(年齢) 挿入する値 25
重複キーがある場合、stuInfo (id,name,age) に VALUES (1,'yoona',20),(1,'xiaosi',25) を挿入して更新 age = VALUES(age) + 1 を実行します。

は以下と同等です:

stuInfo (id,name,age) に VALUES (1,'yoona',20) を挿入します。
stuInfo を更新 
SET 年齢 = VALUES(年齢) + 1
ここで、id = 1;

実行結果:

mysql> stuInfo (id,name,age) に VALUES (1,'yoona',20),(1,'xiaosi',25) を挿入し、重複キーを更新します。age = VALUES(age) + 1;
クエリは正常、3 行が影響を受けました (0.01 秒)
記録: 2 重複: 1 警告: 0
mysql> stuInfo から * を選択します。   
+----+-------+-----+
| ID | 名前 | 年齢 |
+----+-------+-----+
| 1 | ユナ | 26 |
+----+-------+-----+
セット内の 1 行 (0.00 秒)

(2)2番目の状況:

#年齢値20が挿入されました
重複キー更新 age = age + 1 がある場合、stuInfo (id,name,age) に VALUES (1,'yoona',20),(1,'xiaosi',25) を挿入します。

は以下と同等です:

stuInfo (id,name,age) に VALUES (1,'yoona',20) を挿入します。
stuInfo を更新 
SET 年齢 = 年齢 + 1
ここで、id = 1;

実行結果:

mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = age + 1;
クエリは正常、3 行が影響を受けました (0.02 秒)
記録: 2 重複: 1 警告: 0
mysql> stuInfo から * を選択します。
 +----+-------+-----+
| ID | 名前 | 年齢 |
+----+-------+-----+
| 1 | ユナ | 21 |
+----+-------+-----+
セット内の 1 行 (0.00 秒)

重複して挿入されたデータに遭遇した場合、ON DUPLICATE KEY UPDATE を使用して挿入されたデータを変更します。これを使用して、重複して挿入されたデータを取得する (フィールド名を直接使用) か、挿入される重複データを取得する (値 (フィールド名)) ことができます。重複したデータは挿入されません。

挿入されたデータを繰り返します: 上記の例では (1,'yoona',20)

挿入するデータを繰り返します: 上記の例では (1,'yoona',25)

MySQL の主キーと一意キーの重複挿入の解決策の詳細な説明はこれで終わりです。MySQL の主キーと一意キーの重複挿入に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL でデータの重複挿入を回避する 4 つの方法
  • MySQL が重複データを挿入するのを防ぐ 3 つの方法
  • MySql でデータの重複挿入を回避する 3 つの方法
  • mysqlストアドプロシージャは重複データを判定し、挿入しません
  • MYSQLにデータを挿入する際に重複データを無視する方法を共有する
  • MySql でレコードの重複挿入を回避するいくつかの方法
  • MYSQLに重複キー値を挿入するいくつかの方法

<<:  Vue で計算プロパティを使用する際の知識ポイントのまとめ

>>:  a href=# と a href=javascript:void(0) の違いの詳細な説明

推薦する

CSS が複数のクラスに一致する方法のサンプルコード

CSSは複数のクラスにマッチする次の HTML タグ li、クラスはオープン スタイルです。私の要件...

ウェブページ作成時のHTMLタグの使用に注意してください

HTML はプレゼンテーションからコンテンツへの移行を試みており、コンテンツの意味(HTML) とプ...

Vueを使用してタイマー機能を実装する

この記事の例では、タイマー機能を実装するためのVueの具体的なコードを参考までに共有しています。具体...

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント複数行のテキスト コンポーネントを折りたたんで表示し、展...

Mysql+JavaSwing に基づくスーパーマーケット商品管理システムの設計と実装

目次1. 機能紹介2. キーコード2.1 ホームページの機能2.2 製品情報を追加する2.3 データ...

ローカルストレージにブール型の値を保存する際の落とし穴を解決する

LocalStorageはブール値を保存します今日、ブール値データを保存するために localsto...

基本的なウェブページパフォーマンス最適化ルールの簡単な概要

ブラウザのウェブページを最適化するためのいくつかのルールページの最適化静的リソース圧縮ビルド ツール...

Centos7 MySQL データベースのインストールと設定のチュートリアル

1. システム環境yum updateアップグレード後のシステムバージョンは[root@yl-web...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

血の写輪眼と輪廻眼の特殊効果コードを実現するためのHTML+CSS

結果 (完全なコードは下部にあります): 実装は難しくありませんが、繰り返しコードが多くなります。実...

MySQL 8.0 のタイムゾーン問題を解決する手順

ソフトウェアバージョンウィンドウズ: ウィンドウズ10 MySQL: mysql-8.0.16-wi...

Facebook によるインターネット サービスのほぼ完璧な再設計

<br />出典: http://www.a-xuan.cn/?p=197 先ほどFac...

Javascript のスコープとクロージャの詳細

目次1. 範囲2. スコープチェーン3. 語彙の範囲5. 閉鎖の適用6. クロージャの欠陥7. 閉会...

MySQL 5.7 生成列の使用例の分析

この記事では、例を使用して、MySQL 5.7 で生成された列の使用方法を説明します。ご参考までに、...

MySql テーブル、データベース、シャーディング、パーティショニングの知識の詳細な説明

1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...