MySQLでテーブルの値を更新するストアド関数を作成する方法
MySQLの関数は本来、計算結果などを返すことを目的とした機能です。そのため、INSERTやUPDATEのようなテーブル操作を行う目的でストアド関数を作成すると、その動作はストアドプロシージャとほとんど同じものになります。具体的には、UPDATE文でテーブルを更新した後、処理の完了を示す戻り値(例えば1)を返すという構造になります。
サンプルテーブルの確認
以下の例では、「student_marks」というテーブルの値を更新する「tbl_update」という名前のストアド関数を作成します。まず、現在のテーブルの状態を確認しておきましょう。Saurabhさんの行はまだ点数がNULLになっています。
mysql> Select * from student_marks// +---------+------+---------+---------+---------+ | Name | Math | English | Science | History | +---------+------+---------+---------+---------+ | Raman | 95 | 89 | 85 | 81 | | Rahul | 90 | 87 | 86 | 81 | | Mohit | 90 | 85 | 86 | 81 | | Saurabh | NULL | NULL | NULL | NULL | +---------+------+---------+---------+---------+ 4 rows in set (0.00 sec)
ストアド関数の作成
次に、学生の名前と4教科の点数を引数として受け取り、該当する行を更新するストアド関数を作成します。文の区切り文字はDELIMITERで「//」に変更してから実行してください。
mysql> Create Function tbl_Update(S_name Varchar(50),M1 INT,M2 INT,M3 INT,M4 INT)
-> RETURNS INT
-> DETERMINISTIC
-> BEGIN
-> UPDATE student_marks SET Math = M1, English = M2, Science = M3, History = M4 WHERE Name = S_name;
-> RETURN 1;
-> END //
Query OK, 0 rows affected (0.03 sec)
構文のポイント解説
- RETURNS INT:この関数が整数型(INT)の値を返すことを宣言しています。
- DETERMINISTIC:同じ入力に対して常に同じ結果を返すことを示すキーワードです。バイナリログが有効な環境では、この宣言を付けないと関数の作成に失敗することがあります。
- BEGIN〜END:関数本体を囲むブロックです。この中に実際の処理を記述します。
- RETURN 1:更新処理が完了したことを呼び出し元に伝えるため、1を返しています。
関数の実行
それでは、NULLだったSaurabhさんの点数を、この関数を使って登録してみましょう。SELECT文で関数を呼び出すだけで更新が実行されます。
mysql> Select tbl_update('Saurabh',85,69,75,82);
+------------------------------------+
| tbl_update('Saurabh',85,69,75,82) |
+------------------------------------+
| 1 |
+------------------------------------+
1 row in set (0.07 sec)
関数が「1」を返しました。これは更新処理が正常に完了したことを意味します。
更新結果の確認
最後に、テーブルの中身を確認して、値が正しく更新されたかどうかを見てみましょう。
mysql> Select * from Student_marks; +---------+------+---------+---------+---------+ | Name | Math | English | Science | History | +---------+------+---------+---------+---------+ | Raman | 95 | 89 | 85 | 81 | | Rahul | 90 | 87 | 86 | 81 | | Mohit | 90 | 85 | 86 | 81 | | Saurabh | 85 | 69 | 75 | 82 | +---------+------+---------+---------+---------+ 4 rows in set (0.00 sec)
このように、Saurabhさんの行に各教科の点数が正しく登録されました。あらかじめストアド関数を作成しておけば、毎回UPDATE文を書く必要がなく、関数を呼び出すだけでテーブルの値を簡単に更新できるようになります。
-
MySQLで同じ列の値を持つ行を抽出する方法【GROUP BY活用】
はじめにMySQLで「同じ列の値を持つ行」を取得したい場合は、GROUP BY句を使用します。本記事では、実際のサンプルを使いながら、特定の複数のIDに対して共通する値を持つ行を抽出する方法をわかりやすく解説します。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> StudentId int, -> StudentMarks int -> );Query OK, 0 rows affected (4.71 sec)テストデータの挿入insertコマンドを
-
MySQLで月ごとにテーブルの値を合計する方法を解説
MySQLでテーブル内の値を月ごとに合計したい場合は、EXTRACT()関数を使用します。この関数を使うことで、日付から特定の月の情報を抽出できます。例えば、年に関係なく1月のすべての価格を合計したい場合などに便利です。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable1415 -> ( -> ProductPurchaseDate date, -> ProductPrice int -> ); Query OK, 0 rows affected (0.53 se