>  기사  >  데이터 베이스  >  mysql 저장 프로시저와 트리거의 차이점

mysql 저장 프로시저와 트리거의 차이점

(*-*)浩
(*-*)浩원래의
2019-05-09 16:00:064407검색

MySQL 저장 프로시저는 대규모 데이터베이스 시스템에서 특정 기능을 완료하기 위한 SQL 문 집합입니다. 트리거는 저장 프로시저가 실행되는 동안 주로 이벤트에 의해 트리거된다는 점에서 저장 프로시저와 다릅니다. 저장 프로시저 이름을 통해 직접 호출할 수 있습니다.

mysql 저장 프로시저와 트리거의 차이점

저장 프로시저: 대규모 데이터베이스 시스템에서 특정 기능을 완료하는 데 사용되는 SQL 문 집합입니다. Trigger(트리거)는 저장 프로시저와는 다른 특별한 유형의 저장 프로시저입니다. 트리거는 주로 이벤트에 의해 트리거되어 실행되지만 저장 프로시저 이름을 통해 직접 호출할 수 있습니다.

저장 프로시저:
특정 기능을 완료하기 위한 SQL 문 집합입니다.
첫 번째 컴파일 후에는 다시 호출할 때 다시 컴파일할 필요가 없습니다. 사용자 지정 저장 프로시저의 이름을 지정하고 이를 실행하기 위한 매개변수(저장 프로시저에 매개변수가 있는 경우)를 지정합니다.
저장 프로시저는 데이터베이스의 중요한 개체입니다.

장점:

1 모듈식 프로그램 설계 허용(한 번 생성하고 여러 번 사용)

2 더 빠른 실행 허용
3 네트워크 트래픽 감소
4 더 나은 보안 메커니즘

형식:

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

호출 프로시저:

호출 프로시저 이름 사용( )

모든 저장 프로시저 보기 프로시저 상태 표시

생성된 저장 프로시저 보기 프로시저 생성 프로시저 이름 표시

삭제 프로시저 삭제 프로시저 프로시저 이름

In은 매개변수가 외부 입력은 프로세스 내부에서 사용됩니다.

Out은 프로세스 내부에서 매개변수를 변수에 저장하고 외부로 전달하여 사용한다는 의미입니다. 들어오는 변수 자체가 외부에서 데이터를 갖는 경우. , 그러면 프로세스에 들어간 후 가장 먼저 지워지고 null로 설정됩니다.

Inout 데이터는 프로세스 외부에서 내부로 전달되어 사용할 수 있습니다. 동시에 내부 작업 후에 데이터가 사용됩니다. 외부로 반환

트리거:

트리거는 저장 프로시저와는 다른 특별한 형태의 저장 프로시저입니다.

트리거는 주로 이벤트를 통해 실행되지만 저장 프로시저는 저장 프로시저를 통해 직접 호출할 수 있습니다. 프로시저 이름.


기능:

1. 데이터 테이블에 쓰기 전에 데이터를 강제로 확인하거나 변환할 수 있습니다.

2. 트리거에서 오류가 발생하면 변경 결과가 취소됩니다.

Format

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

트리거 개체: 테이블 각 행 트리거에 대해 트리거 바인딩은 기본적으로 테이블의 모든 행이므로 각 행이 변경되면 트리거가 트리거됩니다.

트리거 타이밍: 각 테이블의 해당 행은 SQL 명령이 발생하면

가 다른 상태를 갖게 됩니다. 행의 데이터가 변경되면 각 행에는 항상 두 가지 상태가 있습니다. 데이터 운영 전(이전), 운영 후(이후)
트리거 이벤트:
Mysql에서 트리거의 대상은 데이터 변경(추가, 삭제, 변경)뿐이며 쿼리는 데이터를 변경하지 않습니다.
그래서 쿼리에는 트리거 이벤트가 없습니다
참고:
테이블에는 각 트리거 타이밍에 바인딩된 트리거 이벤트에 해당하는 트리거 유형이 하나만 있을 수 있습니다.
테이블에 트리거를 삽입한 후에는 하나만 있을 수 있습니다. 테이블에 있는 대부분의 트리거는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.