単一のクエリに複数の行を挿入する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
これがトラップです。私は立ち往生し、進む方法について混乱しました。一度に挿入/更新する複数の行があります。方向を教えてください。ありがとう。
キーワード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),
...
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);