MySQLのストアドプロシージャで特定の条件に一致するレコードを更新する方法
MySQLでは、ストアドプロシージャ内でUPDATE文とWHERE句を組み合わせることで、特定の条件に一致するレコードだけを効率的に更新できます。本記事では、実際の手順をサンプルコードとともに段階的に解説します。
1. サンプルテーブルを作成する
まず、デモ用のテーブル「DemoTable」を作成します。
mysql> create table DemoTable
-> (
-> Id int,
-> FirstName varchar(20),
-> LastName varchar(20)
-> );
Query OK, 0 rows affected (0.56 sec)
2. テーブルにデータを挿入する
INSERT文を使って、テーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable values(101,'David','Brown'); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(102,'Chris','Brown'); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable values(103,'John','Doe'); Query OK, 1 row affected (0.07 sec)
3. 挿入したデータを確認する
SELECT文で、テーブル内のすべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+------+-----------+----------+ | Id | FirstName | LastName | +------+-----------+----------+ | 101 | David | Brown | | 102 | Chris | Brown | | 103 | John | Doe | +------+-----------+----------+ 3 rows in set (0.00 sec)
4. ストアドプロシージャを作成する
次に、引数として受け取った氏名で「Id=101」のレコードを更新するストアドプロシージャを作成します。プロシージャ内では、引数(fName、lName)の値をSET句に渡し、WHERE句で更新対象の行を絞り込んでいます。
mysql> delimiter //
mysql> create procedure update_sp(fName varchar(20),lName varchar(20))
-> begin
-> update DemoTable
-> set FirstName=fName,
-> LastName=lName
-> where Id=101;
-> end
-> //
Query OK, 0 rows affected (0.12 sec)
mysql> delimiter ;
ポイント:「delimiter //」は、プロシージャ本体に含まれるセミコロン(;)がSQL文の終端として誤って解釈されるのを防ぐために、区切り文字を一時的に変更するコマンドです。定義が完了したら「delimiter ;」で必ず元に戻しておきましょう。
5. ストアドプロシージャを実行する
CALL文を使って、作成したストアドプロシージャを呼び出します。ここでは、Id=101のレコードの氏名を「Adam Smith」に更新しています。
mysql> call update_sp('Adam','Smith');
Query OK, 1 row affected, 2 warnings (0.08 sec)
6. 更新結果を確認する
再度SELECT文でテーブルの中身を確認すると、Id=101のレコードだけが更新されていることがわかります。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+------+-----------+----------+ | Id | FirstName | LastName | +------+-----------+----------+ | 101 | Adam | Smith | | 102 | Chris | Brown | | 103 | John | Doe | +------+-----------+----------+ 3 rows in set (0.00 sec)
まとめ
このように、ストアドプロシージャ内でUPDATE文とWHERE句を組み合わせれば、特定の条件に一致するレコードのみを安全に更新できます。なお、WHERE句を付け忘れるとテーブル内の全レコードが更新されてしまうため、条件指定には十分注意してください。また、WHERE句の対象カラム(ここではId)にインデックスを設定しておくと、大量データでも高速に処理できます。
-
MySQLのUPDATE文でIF()関数を使い、条件に応じてカラムの値を設定する方法
MySQLでは、UPDATE文の中でIF()関数を組み合わせることで、条件に応じた値を柔軟に設定できます。本記事では、学生の点数データを例に、点数が60点より大きいかどうかを判定し、「PASS」または「FAIL」を自動的にStatusカラムへ設定する方法を解説します。IF()関数の基本構文IF()関数は以下のような形式で使用します。IF(条件, 条件が真の場合の値, 条件が偽の場合の値)この関数をUPDATE文のSET句に記述することで、行ごとに異なる値を一括して更新できます。サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable
-
MySQLのストアドプロシージャでテーブルのレコードを表示する方法
MySQLでは、ストアドプロシージャ内にSELECT文を組み込むことで、テーブルのレコードを簡単に表示できます。ストアドプロシージャを活用すると、よく使うクエリを再利用可能な形で保存できるため、作業の効率化につながります。ここでは、実際の手順を順番に解説していきます。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable1933 ( ClientName varchar(20) ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERT