はじめに
実務にて、非会員制掲示板の 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 Manual の Subqueries 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 敗)