ホームページ  >  記事  >  データベース  >  mysqlストアドプロシージャとトリガーの違い

mysqlストアドプロシージャとトリガーの違い

(*-*)浩
(*-*)浩オリジナル
2019-05-09 16:00:064474ブラウズ

Mysql ストアド プロシージャは、大規模なデータベース システムで特定の機能を完了するための SQL ステートメントのセットです。トリガーは特殊なタイプのストアド プロシージャです。トリガーはストアド プロシージャとは異なり、トリガーは主にイベントをトリガーすることによって実行されます。 、ストアド プロシージャ名を使用してストアド プロシージャを直接呼び出すことができます。

mysqlストアドプロシージャとトリガーの違い

# ストアド プロシージャ: 大規模なデータベース システムで特定の機能を実行するように設計された SQL ステートメントのセットです。トリガー: トリガーはストアド プロシージャとは異なる特殊なタイプのストアド プロシージャです。トリガーは主にイベントによってトリガーされて実行されますが、ストアド プロシージャはストアド プロシージャ名を通じて直接呼び出すことができます。

ストアド プロシージャ:
は大規模なデータベース システム内にあり、
特定の関数を完了する一連の SQL ステートメントです。
はデータベースに保存され、その後first 最初のコンパイル後に再度呼び出す場合、再度コンパイルする必要はありません。
ユーザーは、ストアド プロシージャの名前を指定し、パラメーターを与えることによって実行します (ストアド プロシージャにパラメーターがある場合)。
ストアド プロシージャはデータベース内の重要なオブジェクトです

利点:
1 モジュール式プログラミングが可能 (一度作成して複数回使用)
2 より高速な実行が可能
3 ネットワーク トラフィックの削減
4 より優れたセキュリティメカニズム

形式:

DELIMITER // 
CREATE PROCEDURE 储存名([ IN ,OUT ,INOUT ]?参数名?数据类形...) 
BEGIN 
SQL语句 
END // 
DELIMITER ;

呼び出しプロセス:

呼び出しプロセス名 ()

すべてのストレージを表示プロセスはプロシージャのステータスを表示します。
作成したストアドプロシージャを表示 show createprocedure プロセス名;
プロセスを削除 drop プロシージャプロセス名

In は、パラメータを外部から渡して内部で使用する (プロセス内で使用する) ことを意味します。
Out は、パラメーターがプロセスからのデータを変数に保存し、それを外部で使用できるようにすることを意味します。渡されるものはすべて変数である必要があります。入力される出力変数自体に外部のデータがある場合、プロセスに入った後、最初にクリアして null に設定します
Inout データを外部からプロセスに渡して内部で使用することができ、同時に内部操作後にデータを外部に返します

トリガー トリガー:

トリガーはストアド プロシージャとは異なる特殊なタイプのストアド プロシージャです。
トリガーは主にイベントによってトリガーされ、実行されます。 、ストアド プロシージャはストアド プロシージャ名を介して実行できますが、ストアド プロシージャ名は直接呼び出されます。

機能:
1. データ テーブルに書き込む前にデータの検証または変換を強制できます
2. トリガーでエラーが発生すると、変更の結果は取り消されます

形式

DELIMITER //
Create trigger --触发器名字 触发时机 触发事件 on 表 for each 
row 
Begin 
--操作的内容 
End // 
DELIMITER ;

トリガー オブジェクト: 各行のテーブル上 トリガー バインディングは基本的にテーブル内のすべての行であるため、各行が変更されるとトリガーがトリガーされます
トリガー タイミング: 各テーブルに対応行にはさまざまな状態があります。SQL コマンドが実行されると、
によって行内のデータが変更されます。各行には常に 2 つの状態があります。データ操作前 (before)、データ操作後 (after)
トリガーイベント:
Mysql におけるトリガーの対象はデータの変更であり、対応する操作はデータの変更を行わないクエリ (追加、削除、変更) のみです。データの生成 変更します。
したがって、クエリはイベントをトリガーしません。
注:
テーブル内では、各トリガー タイミングにバインドされたトリガー イベントに対応するトリガー タイプは 1 つだけです。
存在できるのは 1 つだけです。テーブル内に 1 つ 挿入後のトリガー したがって、テーブル内のトリガーの最大数は 6 つだけです

ストアド プロシージャの作成

DELIMITER //
CREATE PROCEDURE addUser
(IN uCode VARCHAR(50),IN uName VARCHAR(20),IN uRole INT,IN sex INT,IN tel VARCHAR(30))
BEGIN
INSERT INTO smbms_user (userCode,userName,userRole,gender,phone)
VALUES(uCode,uName,uRole,sex,tel);
END//
DELIMITER //
查看存储过程 show procedure status;
<insert id="saveUser">
CALL addUser(#{userCode},#{userName},#{userRole},#{gender},#{phone})
</insert>
public int saveUser(
@Param("userCode") String userCode,
@Param("userName") String userName,
@Param("userRole") Integer userRole,
@Param("gender") Integer gender,
@Param("phone") String phone);
public List<User> findUserListPage(String queryUserName, 
Integer queryUserRole, 
Integer currentPageNo, Integer pageSzie);

public boolean saveUser(String userCode, String userName, Integer userRole,
Integer gender, String phone) {
SqlSession sqlSession = null;
int row = 0; // 受影响的行数
try {
sqlSession = MyBatisUtil.createSqlSession();
row = sqlSession.getMapper(UserMapper.class).saveUser(userCode, userName, userRole, gender, phone);
// 提交事务
sqlSession.commit();
} catch (Exception e) {
if (sqlSession != null) {
sqlSession.rollback();
}
row = 0;
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
if (row > 0) {
return true;
}
return false;
}

userService.saveUser("zhangcuishan", "亚索", 1, 2, "15645678941");

トリガーの作成

创建两张表
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
inv int
)
create table my_orders(
id int primary key auto_increment,
goods_id int not null,
goods_num int not null)

insert into my_goods values(null,'手机',1000),(null,'电脑',500),(null,'游戏机',100);

DELIMITER //
CREATE TRIGGER a_i_o_t AFTER INSERT ON my_orders FOR EACH ROW
BEGIN
UPDATE my_goods SET inv =inv -new.goods_num WHERE id=new.goods_id;
END
//
DELIMITER ;

DELIMITER //
CREATE TRIGGER b_i_o_t BEFORE INSERT ON my_orders FOR EACH ROW 
BEGIN 
SELECT inv FROM my_goods WHERE id=new.goods_id INTO @inv;
IF @inv <new.goods_num THEN 
INSERT INTO xxx VALUES('xx');
END IF;
END 
//
DELIMITER //
 

测试 insert into my_orders values(null,3,5);

以上がmysqlストアドプロシージャとトリガーの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。