> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/mysql/cun-chu-guo-cheng-he-chu-fa-qi.md).

# 存储过程和触发器

## 存储过程

存储过程（Stored Procedure）是一种在数据库中存储复杂程序，以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的SQL语句集，经编译创建并保存在数据库中，用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很简单，就是数据库 SQL 语言层面的代码封装与重用。

## 操作存储过程

示例

```
# 创建存储过程
mysql> delimiter $$　　#将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE del_data(IN p_in varchar(10))
    -> BEGIN
    -> 　　DELETE FROM test
    ->    WHERE id=p_in;
    -> END$$
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;　　#将语句的结束符号恢复为分号

# 原始数据
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
| 1    | 1    |
| 2    | 2    |
| 3    | 3    |
+------+------+
3 rows in set (0.001 sec)
# 调用存储过程，传入参数
mysql> call del_data(3);
Query OK, 1 row affected (0.005 sec)

mysql> select * from test;
+------+------+
| id   | name |
+------+------+
| 1    | 1    |
| 2    | 2    |
+------+------+
2 rows in set (0.001 sec)

# 查看数据库的存储过程
SHOW PROCEDURE STATUS where db='test';
# 查看某个存储过程
SHOW CREATE PROCEDURE test.del_data;
# 删除存储过程
DROP PROCEDURE del_data;
```

## 触发器

在指定表上，(**insert**(插入)、**update**(跟新)、**delete**(删除))事件动作,触发（**After**(之后)时机,**Before**(之前)），执行指定的一群或一个sql语句。

量少使用触发器，不建议使用。

## 操作触发器

```
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
```

`trigger_name` : 触发器名称，用户自行指定 `trigger_time`： 触发时机，取值**BEFORE**（之前）、**AFTER**（之后） `trigger_event` : 触发事件，**INSERT**、**UPDATE**、**DELETE**。（插入、更新、删除） `tbl_name` : 需要建立触发器的表名。 `trigger_stmt` : 触发程序体，可以是一条**SQL**语句或是**BEGIN**和**END**包含的索条语句

由上面，可以知道MYSQL可以创建6种类型的触发器。 （**BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE**） （**AFTER INSERT、AFTER UODATE、AFTER DELETE**）

并且**一张表上不能创建两个相同类型的触发器**，因此一张表上面最多能创建6种类型的触发器。

**实例**

```
# 创建触发器
delimiter $$
create trigger tt after insert on test2 for each row
begin
insert into test values(1,1);
end$$
delimiter ;
# 这个触发器的作用是当有数据插入test2表的时候，在test表中插入一条数据

# 查看触发器
show triggers from test;
# 删除触发器
drop trigger test.t_insert;
```
