2 つの条件を使用した INSERT INTO または UPDATE
このクエリには、新しい行が挿入されるテーブルと既存の行のデータを効率的に管理するという課題が伴います。行は特定の条件に基づいて更新する必要があります。テーブルには次のスキーマがあります:
ID INTEGER PRIMARY KEY AUTOINCREMENT name INTEGER values1 INTEGER values2 INTEGER dates DATE
目的は、指定された「名前」と「日付」の組み合わせに新しいデータがある場合に新しい行を挿入することです。ただし、同じ「名前」と「日付」を持つ行がすでに存在する場合は、重複する行を挿入するのではなく、その行を更新する必要があります。
最初の解決策としては、ストアド プロシージャ (SPROC) を使用して、状態を確認し、適切なアクションを実行します。ただし、データが別の言語からプッシュされているため、このアプローチは実現できません。
最適な解決策は、INSERT INTO ... ON DUPLICATE KEY UPDATE 構文を利用することです。これにより、単一のステートメントで、指定された条件に基づいて新しい行の挿入と既存の行の更新の両方を行うことができます。
このシナリオでは、テーブルに一意の複合キー (名前、日付) を定義できます。
unique key(name,dates)
この一意のキーにより、「名前」と「日付」の組み合わせがテーブル内に複数回存在できないことが保証されます。 INSERT クエリを実行するときに、ON DUPLICATE KEY UPDATE 句を使用して、一意キー違反が発生した場合に実行するアクションを指定できます。
INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11') ON DUPLICATE KEY UPDATE values2 = values2 + 1;
このアプローチでは、行に「name」が含まれている場合、指定された 'dates' がすでに存在する場合、新しい行を作成する代わりに、その value2 列が増分されます。この動作により、既存の行が新しいデータで効果的に更新されます。
機能を説明するために、次の例を考えてみましょう。
-- Create the table with the composite unique key 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 a new row or update an existing row INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11') ON DUPLICATE KEY UPDATE values2 = values2 + 1; -- Insert another new row or update the existing row for 'name' 777 INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11') ON DUPLICATE KEY UPDATE values2 = values2 + 1; -- Insert a new row for 'name' 778 INSERT INTO myThing (name, values1, values2, dates) VALUES (778, 1, 1, '2015-07-11') ON DUPLICATE KEY UPDATE values2 = values2 + 1; -- Retrieve the results SELECT * FROM myThing;
これにより、次の出力が生成されます。
+----+------+---------+---------+------------+ | id | name | values1 | values2 | dates | +----+------+---------+---------+------------+ | 1 | 777 | 1 | 2 | 2015-07-11 | | 2 | 778 | 1 | 1 | 2015-07-11 | +----+------+---------+---------+------------+
明らかなように、「name」 777 の行は新しいデータで更新され、「name」 には新しい行が作成されました。 778.
以上が単一の SQL ステートメントを使用して、2 つの条件に基づいてデータベース テーブルに行を効率的に挿入または更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。