web-dev-qa-db-ja.com

MySQL ON DUPLICATE KEY UPDATE for multiple rows insert for single query

単一のクエリに複数の行を挿入する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

これがトラップです。私は立ち往生し、進む方法について混乱しました。一度に挿入/更新する複数の行があります。方向を教えてください。ありがとう。

186
Prashant

キーワードVALUESを使用して、新しい値を参照します( documentation を参照)。

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

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);
2
li rachel