トリガー、ビュー、関数、ストアドプロシージャ

MySQLトリガー

トリガーは、特定の操作中に特定の操作を「自動的に」実行するために使用されます。

挿入削除更新がトリガーを設定した後、挿入削除更新操作を実行すると、設定されたコンテンツが自動的にトリガーされます。

注:テーブルには最大6つのトリガーを設定できます(3 * 2、3つの操作* 2回(前|後))

トリガーを定義する

文法:create trigger 触发器名 before|after 事件 on 表名 for each row 触发器语句;

  • トリガー名は、簡単に区別できるtrigger_xxxにすることをお勧めします。トリガー名を繰り返すことはできません。
  • before | afterは、トリガーステートメントの実行時間を表します。beforeの場合、トリガーステートメントは、挿入|削除|更新操作の前に実行され、afterの後に実行されます。
  • イベントは、挿入、削除、更新操作の1つです。
  • 各行のは、レコードに代わって対応する操作を実行するためのトリガーです。
  • トリガーステートメントは、トリガーが起動したときに実行されるステートメントです。

複数のトリガーステートメント

最初と最後に複数のステートメントを含める必要がある

CREATE TRIGGER 触发器名

before|after

insert|update|delete

ON 表名FOR EACH ROW

BEGIN触发语句1;触发语句2;...触发语句n;

END;

MySQLでは、デフォルトはステートメントの終わりです。コマンドラインを使用すると問題が発生します

コマンドラインで複数のトリガーステートメントを使用する場合は、最初にステートメントターミネーター($$)を変更する必要があります。

インスタンス

DELIMITER @@
CREATE TRIGGER trigger_a_insert AFTER UPDATE ON `account` FOR EACH ROW
BEGIN
INSERT INTO account_history(account_name,changed_cash) VALUES('cust','10000');
END@@

DELIMITER ;
UPDATE account SET cash=cash+1000 WHERE `name`='A';

MySQLビュートリガー

show triggers;
すべてのトリガーを
select * from triggers;
表示information_schemaのトリガーテーブルを
PS:加where条件进行条件查询
show create trigger 触发器名;
表示トリガー作成ステートメントを表示
PS:トリガーを削除:トリガートリガー名を削除;

MySQLトリガーの新しいレコードと古いレコード

3つの主要なトリガーイベントがあります。

  • 挿入:新しいレコード、古いレコードなし。
  • 削除:古いレコードを削除し、新しいレコードは削除しません。
  • 更新:変更後の新しいレコードと変更された古いレコードがあります。

old | newを使用してこれらのレコードを参照できます

  • 各行の後(つまり、トリガーステートメント)

PS:現時点では、複数のトリガーステートメントはなく、開始も終了もありません。

インスタンス

CREATE TRIGGER trigger_a_insert AFTER INSERT ON account FOR EACH ROW
INSERT INTO account_history(account_name,changed_cash)
VALUES(new.name,new.cash);

INSERT INTO account(NAME,cash) VALUES('abc','100');
CREATE TRIGGER trig_a_update AFTER UPDATE ON account FOR EACH ROWINSERT INTO account_history(account_name,changed_cash)VALUES(CONCAT('old:',old.name,';new:',new.name),new.cash-old.cash);

UPDATE account SET cash=cash-1000,NAME='icbc' WHERE NAME='A';

MySQLビュー

ビューSQLステートメントクエリはデータベースに保存されます。これ
は基本的にクエリの結果であり、一時スペースに保存されるの
は仮想テーブルです。クエリ定義
ビューの内容は、データベースに物理的なストレージがなく、一時テーブルに相当するもののみ
でした。参照されるベーステーブルの場合、MySQLビューの役割はフィルタリングに似ています
。1つまたは複数のテーブルすることができます。

ビューの利点:

  • 簡素化、データWYSIWYG
  • セキュリティ、ユーザーは自分が表示できるデータのクエリまたは変更のみが可能
  • 論理的な独立性により、実際のテーブル構造の変更による影響を防ぐことができます

ビューの短所:
パフォーマンスの低下と不便な変更

ビューの役割:

機能1:再利用性の向上。
頻繁なクエリを必要とする複雑なステートメントの場合、ビューを使用することは、ステートメントを一時テーブルとして保存することと同じです。呼び出し時には、ビューの場所からクエリするだけで済みます。
機能2:外部インターフェイスは
、データベースの基になるテーブルが変更されときに安定します、元のテーブルは存在しない可能性がありますが、ビューを使用する場合はこの問題は発生しません。
機能3:セキュリティを向上させ、
特定のフィールドのみを外部インターフェイスに開きます。
機能4:目的がより明確になり、データがより明確になります。

ビューの作成と使用:

文法の
文法構造を作成します

{ CREATE|REPLACE } [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名 [{属性列名}] AS SELECT_STATEMENT(查询语句)
[WITH [CASCADED | LOCAL |] CHECK OPTION]

ALGORITHM:ビューアルゴリズム(1、デフォルト、2、マージ(ビューと外部ステートメントがマージされた後に実行); 3.結果を一時テーブルに保存)

ストアドプロシージャ

ストアドプロシージャの構文:

CREATE procedure `存储过程名` (参数列表)begin	sql语句end;

インスタンス

DELIMITER @@
CREATE PROCEDURE test()BEGINIF 1>0 THEN SELECT 1 ;END IF;END@@DELIMITER ;

CALL test;
DELIMITER @@
CREATE PROCEDURE testcase(IN VALUE INT(11))
BEGIN
CASE VALUE
    WHEN 1 THEN SELECT 1+1;
    WHEN 2 THEN SELECT 1+2;
    WHEN 3 THEN SELECT 1+3;
    ELSE SELECT 1+VALUE;
    END CASE;
END@@
DELIMITER ;


CALL testcase(6);
DELIMITER @@
CREATE PROCEDURE testwhile()
BEGIN
SET @i:=0;
SET @sum:=0;
WHILE @i<=10 DO
SET @sum:=@sum+@i;
SET @i:=@i+1;
END WHILE;
END@@
DELIMITER ;

CALL testwhile;

UDFカスタム関数

UDF構文:

create function 函数名([参数列表]) returns 数据类型begin sql语句; return 值;end;
DELIMITER @@
CREATE FUNCTION testfail() RETURNS VARCHAR(10)
BEGIN
DECLARE num,SUM INT(11) DEFAULT 0;
WHILE num<=100 DO
SET num=num+1;
SET SUM=SUM+num;
END WHILE;
RETURN SUM;
END@@
DELIMITER ;

SELECT testfail();

ストアドプロシージャとUDF関数

ストアドプロシージャと関数の類似点:

  1. これは、Javaのメソッドの概念と同様に、呼び出し時に一度に実行される一連のSQLステートメントのコレクションです。
  2. MySQL関数の拡張機能です

ストアドプロシージャと関数の違い:

  1. ストアドプロシージャには戻り値がありません。関数には戻り値があります
  2. ストアドプロシージャは実行プロセスに焦点を当て、関数は戻り値に焦点を当てています

おすすめ

転載: blog.csdn.net/zmzdmx/article/details/108119842