もし ON DUPLICATE KEY
UPDATE
を指定し、UNIQUE
インデックスか PRIMARY
KEY
内で複製値を引き起こす行が挿入されると、古い行の
UPDATE
が実行されます。たとえば、もしカラム
a
が
UNIQUE
として宣言され、それが値
1
を含んでいたら、次の 2
つのステートメントは同一効果を持ちます。
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE table SET c=c+1 WHERE a=1;
ON DUPLICATE KEY UPDATE
の場合、行ごとの影響を受けた行の値は、行が新しい行として挿入された場合は
1、既存の行が更新された場合は 2 です。
もしカラム b
も固有であれば、INSERT
は代わりにこの
UPDATE
ステートメントと同等になります。
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
もし a=1 OR b=2
がいくつかの行とマッチすれば、1
つの
行だけが更新されます。一般に、一意のインデックスが複数含まれているテーブルに対して
ON DUPLICATE KEY UPDATE
節を使用することは避けるようにしてください。
ON DUPLICATE KEY UPDATE
節には、コンマで区切られた、複数のカラム割り当てを含めることができます。
UPDATE
節で
VALUES(
関数を使用して、col_name
)INSERT
... ON DUPLICATE KEY UPDATE
ステートメントの
INSERT
部分からカラム値を参照できます。つまり、ON
DUPLICATE KEY UPDATE
節にある
VALUES(
は、重複キーの競合が発生していない場合に挿入される
col_name
)col_name
の値を参照します。この関数は複数行のインサートにおいて特に便利です。VALUES()
関数は、INSERT ...
UPDATE
ステートメントの中でだけ意味を持ち、そうでなければ
NULL
を返します。例
:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
そのステートメントは次の 2 つと同一です。
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3; INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9;
テーブルに
AUTO_INCREMENT
カラムが含まれていて、INSERT
... ON DUPLICATE KEY UPDATE
によって行が挿入された場合、LAST_INSERT_ID()
関数は AUTO_INCREMENT
値を返します。このステートメントによって代わりに行が更新された場合、MySQL
5.1.12 より前のバージョンでは
LAST_INSERT_ID()
は意味を持ちません。ただし、LAST_INSERT_ID(
を使用して、これを回避できます。expr
)id
が AUTO_INCREMENT
カラムだと仮定してください。LAST_INSERT_ID()
が更新に意味を持つようにするには、次のように行を挿入してください。
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
ON DUPLICATE KEY UPDATE
を利用するときは
DELAYED
オプションは無視されます。