MySQL でデータの削除 (DELETE)

ここでは MySQL でテーブルのデータを削除 (DELETE) する方法をご説明します。

サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。


DELETE 文でテーブルのデータを削除する

MySQL でテーブルのデータを削除するには DELETE 文を使います。

テーブルのレコードを更新する、基本の DELETE 文の構文は次の通りです。

DELETE
FROM    テーブル名
WHERE   条件文;

テーブルの条件文に合致するレコードを削除します。

デフォルトでは Safe Updates モードが有効化されていて、WHERE 句をつけなかったり、WHERE 句の条件文にキーカラムを使わないとエラーになります。

WHERE 句は必須ではありませんが、WHERE 句をつけないと、Safe Updates モードを OFF にしている場合は、テーブルの全レコードが削除されてしまうのでお気をつけください。

MySQL の Safe Updates モードとは何かと、Safe Updates モードを無効化する方法が知りたい方はこちらをご覧ください。

MySQL の Safe Updates モードを無効化する方法


それでは DELETE 文 を使って、テーブルのデータを削除してみましょう。

次のような students テーブル と exam_results テーブルがあります。

MySQL でデータの削除 (DELETE) 1

MySQL でデータの削除 (DELETE) 2


students テーブルから students_id = 6 のレコードを削除するには、次のような DELETE 文で削除できます。

DELETE
FROM    students
WHERE   student_id = 6;

上の DELETE 文を実行して、students テーブルの中身を確認します。

MySQL でデータの削除 (DELETE) 3

students テーブルから students_id = 6 のレコードが削除されていますね。


同じように students_id = 5 のレコードを削除してみましょう。

DELETE
FROM    students
WHERE   student_id = 5;

上の DELETE 文を実行すると次のようなエラーになります。

MySQL でデータの削除 (DELETE) 4


このエラーの原因は、exam_results テーブルに外部キー制約があり students テーブルの student_id を参照していて、exam_results テーブルに student_id = 5 のデータが存在しているからです。

こういう時は先に外部キーがついているテーブルのデータを削除してからでないと、参照されているテーブルのデータが削除できません。

外部キーを定義する際に ON DELETE CASCADE を付けておけば、参照されているテーブル (students) のデータが削除された時に自動的に外部キーのついているテーブル (exam_results) のデータも消してくれます。ですが、私は気づかないうちにデータが削除されてしまうよりエラーが出たほうがいいので、自分でコントロールするようにしています。


先に外部キーのついている exam_results テーブルの student_id = 5 のレコードを削除してから、students テーブルの student_id = 5 のレコードを削除します。

DELETE
FROM    exam_results
WHERE   student_id = 5;

DELETE
FROM    students
WHERE   student_id = 5;

上の DELETE 文を実行して、students と exam_results テーブルの中身を確認します。

MySQL でデータの削除 (DELETE) 5

MySQL でデータの削除 (DELETE) 6

今度はエラーにならず、students と exam_results テーブルから students_id = 5 のレコードが削除されています。


以上、MySQL でテーブルのデータを削除 (DELETE) する方法をご説明しました。

複数のテーブルを結合 (JOIN) してデータを削除 (DELETE)する方法が知りたい方はこちらをご覧ください。

MySQL 複数テーブルを JOIN してデータを削除 (DELETE)

© 2024 MySQL 入門