MySQL に存在しない場合は挿入

Preet Sanghavi 2022年3月28日
MySQL に存在しない場合は挿入

このチュートリアルでは、MySQL データベースのテーブルで INSERT IF NOT EXISTS 句を使用する方法を理解することを目的としています。

テーブル内の存在を確認せずに、テーブルの特定の列に特定の値を挿入することがよくあります。ただし、特定のテーブルに値を挿入するときに、値の重複を避ける必要がある場合があります。

自動車販売店の例を考えてみましょう。cars テーブルにデータを挿入するときに、特定のタイプの車の car id がテーブルに 2 回挿入されることは望ましくありません。

MySQL には、この操作を効率的に実行するのに役立つ INSERT IF NOT EXISTS 句が用意されています。INSERT IF NOT EXISTS の基本的な構文は次のとおりです。

INSERT INTO name_of_the_table (column_name)
SELECT * FROM (SELECT value_name) AS val
WHERE NOT EXISTS (<conditonal expression>);

name_of_the_table では、conditonal expression が満たされた場合、column_namevalue_name を挿入します。

ただし、始める前に、ダミーのデータセットを作成しましょう。

-- create the table student_details
CREATE TABLE student_details(
  stu_id int,
  stu_firstName varchar(255) DEFAULT NULL,
  stu_lastName varchar(255) DEFAULT NULL,
  primary key(stu_id)
);
-- insert rows to the table student_details
INSERT INTO student_details(stu_id,stu_firstName,stu_lastName) 
 VALUES(1,"Preet","Sanghavi"),
 (2,"Rich","John"),
 (3,"Veron","Brow"),
 (4,"Geo","Jos"),
 (5,"Hash","Shah"),
 (6,"Sachin","Parker"),
 (7,"David","Miller");

MySQL の INSERT IF NOT EXISTS

stu_id8 として Preet という名前の新しい学生を挿入することにより、MySQL で INSERT IF NOT EXISTS を使用する方法を理解しましょう。

ただし、この値を挿入するのは、テーブル内の既存の学生の名が Preet と一致しない場合のみです。この操作は、次のクエリを使用して実行できます。

INSERT INTO student_details(stu_id,stu_firstName, stu_lastName)
SELECT * FROM (SELECT 8 as stu_id, 'Preet' AS customer_name, 'Shah' AS stu_lastName) AS new_value
WHERE NOT EXISTS (
    SELECT stu_firstName FROM student_details WHERE stu_firstName = 'Preet'
) LIMIT 1;

次に、次のクエリで student_details テーブルを確認します。

SELECT * from student_information;

前述のクエリにより、次の出力が得られます。

stu_id	stu_firstName	stu_lastName
1	      Preet	        Sanghavi
2	      Rich	        John
3	      Veron	        Brow
4	      Geo	        Jos
5	      Hash	        Shah
6	      Sachin	    Parker
7	      David	        Miller

ご覧のとおり、student_details テーブルには Preet という名がすでに存在するため、新しい値はテーブルに追加されていません。

stu_id9stu_firstNameDhruvstu_lastNameShah として別の生徒を追加してみましょう。この操作は、次のクエリを使用して実行できます。

INSERT INTO student_details(stu_id,stu_firstName, stu_lastName)
SELECT * FROM (SELECT 9 as stu_id, 'Dhruv' AS customer_name, 'Shah' AS stu_lastName) AS new_value
WHERE NOT EXISTS (
 SELECT stu_firstName FROM student_details WHERE stu_firstName = 'Dhruv'
) LIMIT 1;

上記のクエリに見られるように、stu_firstName の生徒がまだテーブルに存在しない場合は、Dhruv として追加します。

前述のクエリの出力は次のとおりです。

stu_id	stu_firstName	stu_lastName
1		Preet			Sanghavi
2		Rich			John
3		Veron			Brow
4		Preet			Jos
5		Hash			Shah
6		Sachin			Parker
7		David			Miller
9		Dhruv			Shah

名に重複がないため、stu_id9 として持つ新しいエントリ Dhruv Shah が作成されました。

したがって、INSERT IF NOT EXISTS ステートメントを使用すると、挿入する値が MySQL の NOT EXISTS 句で必要な条件を満たす場合、テーブルに詳細を効率的に入力できます。

著者: Preet Sanghavi
Preet Sanghavi avatar Preet Sanghavi avatar

Preet writes his thoughts about programming in a simplified manner to help others learn better. With thorough research, his articles offer descriptive and easy to understand solutions.

LinkedIn GitHub

関連記事 - MySQL Query