二重条件による 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 サイトの他の関連記事を参照してください。