ホームページ > データベース > mysql チュートリアル > MySQL で複合キーに基づいて行を効率的に挿入または更新するにはどうすればよいですか?

MySQL で複合キーに基づいて行を効率的に挿入または更新するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-29 18:36:11
オリジナル
376 人が閲覧しました

How Can I Efficiently Insert or Update Rows Based on a Composite Key in MySQL?

二重条件による INSERT INTO または UPDATE

名前と日付で識別される複数のエンティティのデータを追跡するテーブルを考えてみましょう。毎日、名前値の有限リストに対して将来の日付を含む新しい行が生成されます。目的は、行が存在しない場合は新しい行を挿入し、存在する場合は既存の行を更新することです。

一般的な解決策は、条件をチェックするストアド プロシージャかもしれませんが、これは次の理由により実行できません。データが別の言語からプッシュされています。

解決策: INSERT ON DUPLICATE KEY UPDATE

MySQL 機能 INSERT ON DUPLICATE KEY UPDATE は、この問題に対する洗練された解決策を提供します。一意のキーまたはインデックスに基づいて、新しい行が存在しない場合は新しい行を挿入し、存在する場合は既存の行を更新できます。

この場合、(name,日付)で十分です。挿入が試行されると、MySQL はこの一意のキーによる競合を検出し、代わりに更新を実行します。

例:

CREATE TABLE myThing (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name INT NOT NULL,
    values1 INT NOT NULL,
    values2 INT NOT NULL,
    dates DATE NOT NULL,
    UNIQUE KEY (name, dates)
);

INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;
ログイン後にコピー

次のコマンドを使用して複数の挿入を実行します。同じ (名前、日付) 値の場合は、values2 列を更新できます。したがって:

INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;
ログイン後にコピー

結果:

SELECT *
FROM myThing;

+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates      |
+----+------+---------+---------+------------+
| 1  | 777  | 1       | 3       | 2015-07-11 |
+----+------+---------+---------+------------+
ログイン後にコピー

ご覧のとおり、INSERT ON DUPLICATE KEY UPDATE 句は既存の行の value2 列を効果的に更新します。

以上がMySQL で複合キーに基づいて行を効率的に挿入または更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート