MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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)にインデックスを設定しておくと、大量データでも高速に処理できます。

  1. MySQLのUPDATE文でIF()関数を使い、条件に応じてカラムの値を設定する方法

    MySQLでは、UPDATE文の中でIF()関数を組み合わせることで、条件に応じた値を柔軟に設定できます。本記事では、学生の点数データを例に、点数が60点より大きいかどうかを判定し、「PASS」または「FAIL」を自動的にStatusカラムへ設定する方法を解説します。IF()関数の基本構文IF()関数は以下のような形式で使用します。IF(条件, 条件が真の場合の値, 条件が偽の場合の値)この関数をUPDATE文のSET句に記述することで、行ごとに異なる値を一括して更新できます。サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable

  2. MySQLのストアドプロシージャでテーブルのレコードを表示する方法

    MySQLでは、ストアドプロシージャ内にSELECT文を組み込むことで、テーブルのレコードを簡単に表示できます。ストアドプロシージャを活用すると、よく使うクエリを再利用可能な形で保存できるため、作業の効率化につながります。ここでは、実際の手順を順番に解説していきます。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable1933 ( ClientName varchar(20) ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERT