MySQL ON DUPLICATE KEY UPDATEは単一のクエリで複数の行を挿入します


199

1つのクエリに複数の行を挿入するSQLクエリがあります。だから私は次のようなものを使いました:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

問題は、このクエリを実行するときに、上記のようUNIQUEな(以外のPRIMARY KEY)キーをチェックする必要があるかどうかを確認することです。そのようなキー'name''name'すでに存在する場合は、対応する行全体を更新して、挿入する必要があります。

たとえば、以下の例で'Katrina'は、すでにデータベースに存在する場合、フィールドの数に関係なく、行全体を更新する必要があります。再び'Samia'存在しない場合は、行を挿入する必要があります。

私は使用を考えました:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

これが罠です。私は行き詰まり、続行方法について混乱しました。一度に複数の行を挿入/更新します。指示をお願いします。ありがとう。

回答:


479

キーワードVALUESを使用して新しい値を参照します(ドキュメントを参照)。

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
行ごとに異なる条件を持つIFステートメントをUPDATEに含める必要がある場合はどうなりますか?
ロジック

2
@logic:これに関連するいくつかの質問があります:StackOverflow search。それらのどれもあなたの質問に答えない場合は、あなたが正確に必要なものを説明する新しい質問を投稿してください。
Peter Lang、

@logicあなたはあなたの問題の解決策を見つけましたか?現在、私は同じ問題に直面しています
Parth kharecha

素晴らしい提案。重複するときに値をインクリメントする場合は、「ON DUPLICATE KEY UPDATE」の後にこれを追加します。合計=合計+ VALUES(合計)
フェニックス

1

INSERT INTO ... ON DUPLICATE KEY UPDATEはMYSQLでのみ機能し、SQL Serverでは機能しません。

SQLサーバーの場合、これを回避する方法は、まず一時テーブルを宣言し、その一時テーブルに値を挿入してから、MERGEを使用することです。

このような:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
だれがSQLサーバーを使用するか:D
Jeremy Belolo 2018

-3

INSERT ... ON DUPLICATE KEY UPDATEの代わりにReplaceを使用できます 。


28
はい。ただし、REPLACEを使用すると、新しい行が挿入される前に古い行が削除されます。プライマリIDを維持するために古い行を保持したい。
Prashant 2010

2
古いPKを保持することがどういうわけかあなたにとって重要であることを
知り

4
PS: "replace into"には、削除と挿入の両方の特権が必要です!
Oliver M Grech

2
上記の削除/挿入の理由により、これらのインスタンスでは速度が大幅に低下します。
ロス

1
いくつかの列を更新したい場合はどうなりますか?置換するとすべて更新されます。
imVJ 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.