Open1

MySQLで特定条件のレコードが存在しない場合だけ挿入する

sagittariussagittarius

WHERE NOT EXISTS を使う

例えば、usersテーブルのuser_id、service_idカラムにそれぞれ1, 2という値を持つレコードを挿入したい。ただし、usersテーブルで既にそのようなレコードが存在しない場合のみ挿入し、存在するときは挿入しないようにしたい。
このとき、正解例の一つは以下だが、注意点がある。

INSERT INTO users (user_id, service_id)
SELECT * FROM (SELECT 1 AS 'user_id', 2 AS 'service_id') AS tmp
WHERE NOT EXISTS
(SELECT 1 FROM users WHERE user_id = 1 AND service_id = 2 AND delete_flg = 0);

挿入する複数の値はVALUESなどで書かないでSELECT文を使って書くことに注意。
さらに、(SELECT 1 AS 'user_id', 2 AS 'service_id')は一時的な値だが、ASで項目名を指定しておかないと、仮にuser_idもservice_idも1のレコードを挿入したいときに同じ項目値になってエラーになるので注意。(例えば、(SELECT 1, 2) AS tmpはOKだが、(SELECT 1, 1) AS tmpはダメということ)
当たり前のことだが、変数などで値を扱うとうっかり忘れるので注意。