MySQL でストアドファンクションを作成し、トリガーを設定する方法

WBOY
リリース: 2023-06-02 22:43:38
転載
1606 人が閲覧しました

ストアド関数もストアド プロシージャと同様、プロシージャ オブジェクトの 1 つです。これらのコード スニペットには、アプリケーションおよび SQL から呼び出すことができる SQL および手続き型ステートメントが含まれています。ただし、いくつかの違いもあります:

1. ストレージ関数自体が出力パラメーターであるため、ストレージ関数には出力パラメーターがありません。

2. CALL ステートメントを使用してストアド関数を呼び出すことはできません。

3. ストアド関数には RETURN ステートメントが含まれている必要があり、この特殊な SQL ステートメントをストアド プロシージャ

1. ストアド関数の作成

CREATE FUNCTION ステートメントを使用してストアド関数を作成します

構文形式:

CREATE FUNCTION ストレージ関数名 ([パラメータ[,...]])
RETURNS タイプ
関数本体

注: ストアド関数にストアド プロシージャと同じ名前を付けることはできません。ストアド関数本体には RETURN value ステートメントが含まれている必要があり、値はストアド関数の戻り値です。

例: Book テーブル内の書籍の数を結果として返すストアド関数を作成します。

DELIMITER $$
CREATE FUNCTION num_book()
RETURNS INTEGER
BEGIN
RETURN(SELECT COUNT(*)FROM Book);
END$$
DELIMITER ;
ログイン後にコピー

RETURN 句に SELECT ステートメントが含まれる場合、SELECT ステートメントの戻り結果は次のとおりです。 1 行であり、値の列が 1 つだけあります。ストアド関数にパラメータが必要ない場合でも、それを呼び出すときに () を使用する必要があります (例: num_book())。

例: Sell テーブルには存在するが Book テーブルには存在しないレコードを削除するストアド関数を作成します。

DELIMITER $$
CREATE FUNCTION del_sell(book_bh CHAR(20))
RETURNS BOOLEAN
BEGIN
DECLARE bh CHAR(20);
SELECT 图书编号 INTO bh FROM Book WHERE 图书编号=book_bh;
IF bh IS NULL THEN
DELETE FROM Sell WHERE 图书编号=book_bh;
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END$$
DELIMITER ;
ログイン後にコピー

ストアド関数は入力パラメータとして書籍番号を与え、最初に指定されたキーを押します。 book Book テーブル内でその書籍番号の書籍があるかどうかを検索します。書籍がない場合は false を返し、あれば true を返します。同時に、この書籍番号の書籍を Sell テーブルから削除する必要があります。データベース内のストアド プロシージャを一覧表示するには、SHOW FUNCTION STATUS コマンドを使用します。

2. ストアド関数の呼び出し

ストアド関数作成後のストアド関数の呼び出し方法は、システムが提供する組み込み関数を使用する場合と同じで、SELECT 関数を使用します。キーワード。

構文形式:

SELECT ストレージ関数名 ([パラメータ[,...]])

例: ストレージ関数publish_bookを作成します。ストレージ関数 author_book を呼び出して本の著者を取得し、著者の姓が「Zhang」であるかどうかを判断し、そうである場合は出版時刻を返し、そうでない場合は「unsatisfactory」を返します。

DELIMITER $$
CREATE FUNCTION publish_book(b_name CHAR(20))
RETURNS CHAR(20)
BEGIN
DECLARE name CHAR(20);
SELECT author_book(b_name)INTO name;
IF name like'张%' THEN
RETURN(SELECT 出版时间 FROM Book WHERE 书名=b_name);
ELSE
RETURN'不合要求';
END IF;
END$$
DELIMITER ;
ログイン後にコピー

ストアド関数publish_bookを呼び出して、結果を表示します:

SELECTpublish_book('Computer Network Technology');

ストアド関数を削除する方法処理方法は基本的に同じで、DROP FUNCTION ステートメントを使用します。

構文形式:

DROP FUNCTION [IF EXISTS] には関数名が格納されます

注: IF EXISTS 句は MySQL の拡張機能です。関数が存在しない場合、エラーの発生を防ぎます。

例: ストアド関数 a の削除

DROP FUNCTION IF EXISTS a;
ログイン後にコピー

3トリガーの作成

CREATE TRIGGER ステートメントの使用トリガーの作成

構文形式:

CREATE TRIGGER トリガー名 トリガー時間 トリガー イベント
ON テーブル名FOR EACH ROW トリガー アクション

トリガーには、BEFORE と AFTER という 2 つのトリガー オプションがあり、それぞれ、トリガーがアクティブ化されるステートメントの前または後にトリガーされることを示します。通常、AFTER オプションは、トリガーをアクティブにした後にステートメントを実行するために使用されます。 BEFORE オプションは、新しいデータが使用制限に準拠していることを確認するために使用されます。

SELECT ステートメントを含むトリガーはクライアントに結果を返します。この状況を回避するには、トリガー定義で SELECT ステートメントを使用しないようにしてください。同様に、クライアントにデータを返すストアド プロシージャを呼び出すことはできません。

例: 列 a が 1 つだけあるテーブル table1 を作成し、そのテーブルにトリガーを作成し、各挿入操作中にユーザー変数 str の値を TRIGGER IS WORKING に設定します。

CREATE TABLE table1(a INTEGER);
CREATE TRIGGER table1_insert AFTER INSERT
ON table1 FOR EACH ROW
SET@str='TRIGGER IS WORKING';
ログイン後にコピー

データベースにどのトリガーがあるかを確認するには、SHOW TRIGGERS コマンドを使用します。

MySQL トリガーの SQL ステートメントは、テーブル内の任意の列に関連付けることができます。ただし、列の名前を直接使用して列をマークすることはできず、システムが混乱することになります。これは、トリガーをアクティブにするステートメントで新しい列名が変更、削除、または追加されている可能性がある一方で、列の古い名前が最初に存在している可能性があるためです。同時。 NEW.column_name または OLD.column_name という構文を使用して識別する必要があります。 NEW.column_name は新しい行の列を参照するために使用され、OLD.column_name は更新または削除する前に既存の行の列を参照するために使用されます。

INSERT ステートメントの場合は NEW のみが有効であり、DELETE ステートメントの場合は OLD のみが有効です。 UPDATE ステートメントは NEW および OLD と同時に使用できます。

「Book」テーブル内の書籍の情報が削除されると、その書籍に関連する「Sell」テーブル内のデータもすべて削除されるようにトリガーを作成します。

DELIMITER $$
CREATE TRIGGER book_del AFTER DELETE
ON Book FOR EACH ROW
BEGIN
DELETE FROM Sell WHERE 图书编号=OLD.图书编号;
END$$
DELIMITER ;
ログイン後にコピー

トリガーがテーブル自体の更新操作をトリガーしたい場合、使用できるのは BEFORE トリガーのみであり、AFTER トリガーは許可されません。

4. トリガーでストアド プロシージャを呼び出す

例: ブックストア データベースに、Members テーブルと同じ構造を持つテーブル member_b があるとします。トリガーを作成し、そこにデータを追加します。 Members テーブル。 の場合、ストアド プロシージャを呼び出して、member_b テーブルのデータを Members テーブルと同期します。

1. ストアド プロシージャを定義します: Members テーブルと同じ構造を持つテーブル member_b を作成します

DELIMITER $$
CREATE PROCEDURE data_copy()
BEGIN
REPLACE member_b SELECT * FROM Members;
END$$
ログイン後にコピー

2. トリガーを作成します: ストアド プロシージャ data_copy()

DELIMITER $$
CREATE TRIGGER members_ins AFTER INSERT
ON Members FOR EACH ROW
CALL data_copy();
DELIMITER ;
ログイン後にコピー
# を呼び出します##5 、トリガーの削除

構文形式:

DROP TRIGGER トリガー名

例: トリガーの削除 members_ins

DROP TRIGGER members_ins;
ログイン後にコピー

以上がMySQL でストアドファンクションを作成し、トリガーを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート