MySql でデータの重複挿入を回避する 3 つの方法

MySql でデータの重複挿入を回避する 3 つの方法

序文

MySql で主キーの競合または一意キーの競合が発生した場合、挿入方法に応じてエラーを回避するための挿入方法が一般的に 3 つあります。

  1. 無視を挿入します。
  2. 置き換える
  3. 重複キーの更新時に挿入

挿入無視

insert ignore は、データベースにすでに存在するデータを無視します。主キーまたは一意のインデックスに基づいてデータベースにデータがない場合、新しいデータを挿入します。データがある場合は、このデータをスキップします。

小型ケース

テーブル構造

ルート:テスト> show create table t3G
************************** 1. 行 ****************************
  表: t3
テーブルの作成: CREATE TABLE `t3` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c1` int(11) デフォルト NULL,
 `c2` varchar(20) デフォルト NULL,
 `c3` int(11) デフォルト NULL,
 主キー (`id`)、
 ユニークキー `uidx_c1` (`c1`)
) エンジン=InnoDB AUTO_INCREMENT=18 デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)

ルート:テスト> t3 から * を選択します。
 +----+------+------+------+
 | id | c1 | c2 | c3 |
 +----+------+------+------+
 | 1 | 1 | 1 | 1 |
 | 2 | 2 | 1 |
 | 8 | NULL | NULL | 1 |
 | 14 | 4 | bb | NULL |
 | 17 | 5 | cc | 4 |
 +----+------+------+------+
 セット内の行数は 5 です (0.00 秒)

競合するデータを挿入する

root:test> insert ignore into t3 (c1,c2,c3) values(5,'cc',4),(6,'dd',5); クエリは正常、1行が影響を受け、1つの警告 (0.01秒)
記録: 2 重複: 1 警告: 1

結果を見る

root:test> 警告を表示します。
+---------+------+---------------------------------------+
| レベル | コード | メッセージ |
+---------+------+---------------------------------------+
| 警告 | 1062 | キー 'uidx_c1' のエントリ '5' が重複しています |
+---------+------+---------------------------------------+
セット内の 1 行 (0.00 秒)

ルート:テスト> t3 から * を選択します。
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 |
| 8 | NULL | NULL | 1 |
| 14 | 4 | bb | NULL |
| 17 | 5 | cc | 4 |
| 18 | 6 | dd | 5 |
+----+------+------+------+
セット内の 6 行 (0.00 秒)

置き換える

replace into は最初にデータを挿入しようとし、競合が見つかった場合はそれを削除します。それ以外の場合は何もしないでください。

小型ケース

ルート:テスト> show create table t3G
************************** 1. 行 ****************************
  表: t3
テーブルの作成: CREATE TABLE `t3` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c1` int(11) デフォルト NULL,
 `c2` varchar(20) デフォルト NULL,
 `c3` int(11) デフォルト NULL,
 主キー (`id`)、
 ユニークキー `uidx_c1` (`c1`)
) エンジン=InnoDB AUTO_INCREMENT=4 デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)

ルート:テスト> t3 から * を選択します。
+----+------+-------+------+
| id | c1 | c2 | c3 |
+----+------+-------+------+
| 1 | 1 | cc | 4 |
| 2 | 2 | dd | 5 |
| 3 | 3 | いいえ | 3 |
+----+------+-------+------+
セット内の 3 行 (0.00 秒)

競合するデータを挿入する

root:test> t3 (c1,c2,c3) に値を置き換えます(3,'new',8);
クエリは正常、2 行が影響を受けました (0.02 秒)

ルート:テスト> t3 から * を選択します。
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | cc | 4 |
| 2 | 2 | dd | 5 |
| 4 | 3 | 新着 | 8 |
+----+------+------+------+
セット内の 3 行 (0.00 秒)

元のレコードが消えて、新しいレコードが出現したことがわかります。

重複キーの更新時に挿入

insert into 文の最後に insert on duplicate key update を指定した場合、重複した値が出現すると、重複した値が出現した後に更新が行われます。

場合

ルート:テスト> show create table t3G
************************** 1. 行 ****************************
  表: t3
テーブルの作成: CREATE TABLE `t3` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `c1` int(11) デフォルト NULL,
 `c2` varchar(20) デフォルト NULL,
 `c3` int(11) デフォルト NULL,
 主キー (`id`)、
 ユニークキー `uidx_c1` (`c1`)
) エンジン=InnoDB AUTO_INCREMENT=4 デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)

ルート:テスト> t3 から * を選択します。 
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | 4 |
| 2 | 2 | ユーチュー | 3 |
| 3 | 3 | czx | 5 |
+----+------+------+------+
セット内の 3 行 (0.00 秒)

レコード id=3 の一意のキー (列 c1) と競合するデータを挿入します。

root:test> t3(c1,c2,c3) に値 (3,'new',5) を挿入し、重複キーを更新します。c1=c1+3; 
クエリは正常、2 行が影響を受けました (0.01 秒)

ルート:テスト> t3 から * を選択します。
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | 4 |
| 2 | 2 | ユーチュー | 3 |
| 3 | 6 | czx | 5 |
+----+------+------+------+
セット内の 3 行 (0.00 秒)

id=3 のレコードが変更され、c1=元の c1+3 となり、他の列は変更されていないことがわかります。

上記は、重複データの挿入を回避するための 4 つの MySql メソッドの詳細です。重複データの挿入を回避するための MySQL の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL が重複データを挿入するのを防ぐ 3 つの方法
  • MySQLは重複しないデータ挿入を実装するためにUNIQUEを使用する
  • MySQL が重複レコードを挿入するのを防ぐ方法
  • MySql でレコードの重複挿入を回避するいくつかの方法
  • MySQL でデータの重複挿入を回避する 4 つの方法

<<:  Vue でコミュニケーションを実装する 8 つの方法

>>:  Linux のハードリンクとソフトリンクの区別

推薦する

ハイパーリンクAタグを学ぶ

聞く: CSS を使用してハイパーリンクのスタイルを設定しましたが、ホバーしても機能しません。なぜこ...

MySQLで判定文を書く方法のまとめ

MySQL で判断文を書く方法:方法1. CASE関数case関数の構文: CASE条件 値1の場合...

ドメイン名、ポート、異なるIPに基づくnginx仮想ホスト設定の実装

1. nginx仮想ホストの設定仮想ホストを使用すると、実行する Web サイトごとに個別の Ngi...

macOS SierraにApache2.4+PHP7.0+MySQL5.7.16をインストールする

Mac システムには PHP と Apache が付属していますが、必要なバージョンではない場合があ...

MySQLでデータベースのインストールパスを表示する方法

mysql コマンドを使用して、mysql のインストール パスを表示できます。 # 次の 2 つの...

MySQL 5.7 mysql コマンドラインクライアントの使用コマンドの詳細

MySQL 5.7コマンドを使用するMySQLコマンドラインクライアント1. パスワードを入力してく...

純粋な CSS を使用してユーザーが Web ページのコンテンツをコピーするのを防ぐ方法

序文私自身の個人ブログを入力しているときに、ブログの詳細ページでさまざまなコンテンツをコピーするさま...

ソースコードの観点からキープアライブコンポーネントのキャッシュ原理に答える

今日は、早速本題に入り、面接中に尋ねられた質問、つまりキープアライブ コンポーネントのキャッシュ原理...

あなたのウェブサイトはIE8に適していますか?

オリンピック期間中にIE8ベータ2がリリースされ、英語版のリリースに合わせて中国語版も第一波でリリー...

Amap を使用した React 実装例 (react-amap)

React の PC 版は Amap を使用するようにリファクタリングされました。情報を検索したと...

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...

docker compose を使ってワンクリックで分散構成センター Apollo を展開するプロセスの詳細な説明

導入分散について話すときは、分散構成センター、分散ログ、分散リンク トラッキングなどについて考える必...

Vue+echarts で積み上げ棒グラフを実現

この記事では、積み上げ棒グラフを実装するためのVue+echartsの具体的なコードを参考までに紹介...

見落としがちなVue.jsのAPIを詳しく解説

目次次のチェックv-model 構文シュガー.sync 修飾子$セット計算プロパティセット要約する次...

セマンティック HTML タグの紹介

ここ数年、ウェブサイト開発では DIV+CSS が非常に人気があり、当時は大きな騒動を引き起こしまし...