平成30/ 2018-12-17 10:53
MYSQL/ INSERT & UPDATE/ DUPLICATE

インサート失敗したらUPDATEする
primary key(auto_incrementでない), unique index していることが条件。

insert into hoge(
    id, name, detail
)
values(
    1, 'NAME','DETAIL'
)
on duplicate key update
    name='NAME', detail='DETAIL'
;
(1に対して、INSERTできなかった場合に UPDATEする。)

同じようなもので、
REPLACE INTOがあるが、
これは、DELETEしてからINSERTなので、
オススメではない(フラグメンテーション(断片化)が発生してしまうから)。


|
| 例
|----------
insert into medicine_views(id, views) values(
id, 1
) on duplicate key update views = views+1


|
| SELECT文での指定もできる
|----------
insert into kirakira
(
    campaign_season_info_id, classroom_info_id, title, detail
)
select campaign_season_info_id, classroom_info_id, title, detail
from
    kirakira_request t2
where
    campaign_season_info_id = 7 and
    classroom_info_id in(10, 11, 12, 14)
on duplicate key update
    title = t2.title, detail = t2.detail
;



|
| こんなこともできるってー!
|----------
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 t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)





|
| Thanks.
|----------
[MySQL]1クエリーで複数レコードのUpdate、さらにはUpdateとInsertを同時にやってしまおう。むっはっはの巻
http://blog.trippyboy.com/2014/mysql/mysql%EF%BC%91%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC%E3%81%A7%E8%A4%87%E6%95%B0%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AEupdate%E3%80%81%E3%81%95%E3%82%89%E3%81%AB%E3%81%AFupdate%E3%81%A8insert/3/

INSERT INTO … SELECT FROM … ON DUPLICATE KEY UPDATE
http://stackoverflow.com/questions/2472229/insert-into-select-from-on-duplicate-key-update

MySQL: INSERT...ON DUPLICATE KEY UPDATEまとめ
http://qiita.com/yuzroz/items/f0eccf847b2ea42f885f

MySQL で INSERT と UPDATE を1文で実現する ~REPLACE 構文編~
http://www.united-bears.co.jp/blog/archives/2786

http://dev.mysql.com/doc/refman/5.1-olh/ja/insert-on-duplicate.html
INSERT ... ON DUPLICATE KEY UPDATE 構文
もし 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 です。