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関数
ストアドプロシージャと関数の類似点:
- これは、Javaのメソッドの概念と同様に、呼び出し時に一度に実行される一連のSQLステートメントのコレクションです。
- MySQL関数の拡張機能です
ストアドプロシージャと関数の違い:
- ストアドプロシージャには戻り値がありません。関数には戻り値があります
- ストアドプロシージャは実行プロセスに焦点を当て、関数は戻り値に焦点を当てています