MySQL で重複する値がなければ INSERT する

はじめに

実務にて、非会員制掲示板の React Native + Expo CLI ガワネイティブアプリにユーザーブロック機能を実装してほしいという小仕事の依頼があり、それを解決した情報になります。ソースコードの SQL 文を模倣するだけで簡単に流用ができます。

ソースコード

INSERT INTO 表名 (列名) 
SELECT 入力値 
WHERE NOT EXISTS (
  SELECT * 
  FROM 表名 
  WHERE name = 入力値
)

検証環境

解説

アプリ側から固有識別子を Web 側に渡してデータベースのテーブルにデータが重複しないように挿入する SQL 文の解説になります。

重複判定は、NOT EXISTS 句と副問い合わせ(サブクエリー)で実現できます。

WHERE NOT EXISTS (
  SELECT * 
  FROM 表名 
  WHERE name = 入力値
)

NOT EXISTS 句と副問い合わせ(サブクエリー)については、MySQL 5.7 Reference ManualSubqueries with EXISTS or NOT EXISTS に情報があります。

あとは、重複判定を INSERT 文の WHERE 句 に組み込むだけです。

INSERT INTO 表名 (列名) 
SELECT 入力値 
WHERE NOT EXISTS (
  SELECT * 
  FROM 表名 
  WHERE name = 入力値
)

実際に phpMyAdmin でクエリーを実行して試してみます。

下記のようなテーブル(vtuber)を作成して、

下記のクエリーを実行しました。

INSERT INTO vtuber (name) 
SELECT '桐生ココ'
WHERE NOT EXISTS (
  SELECT * 
  FROM vtuber 
  WHERE name = '桐生ココ'
)

結果、入力値の「桐生ココ」は重複しているので挿入されませんでした。

次は、下記のクエリーを実行しました。

INSERT INTO vtuber (name) 
SELECT 'YAGOO' 
WHERE NOT EXISTS (
  SELECT * 
  FROM vtuber 
  WHERE name = 'YAGOO'
)

結果、入力値の「YAGOO」は重複していないので挿入されました。AUTO_INCREMENT のシーケンス番号が 14 になっているのはデバッグの影響です。

テーブル(vtuber)の状態です。

以上です。

おわりに

SQL 文をテキストエディタに貼り付けて編集する際は、シングルコーテーション(’)がプライム(’)に自動変換されていないか注意しましょう。(1 敗)

参考資料