Maison  >  Article  >  base de données  >  La différence entre les procédures stockées et les déclencheurs MySQL

La différence entre les procédures stockées et les déclencheurs MySQL

(*-*)浩
(*-*)浩original
2019-05-09 16:00:064407parcourir

La procédure stockée MySQL est un ensemble d'instructions SQL pour exécuter des fonctions spécifiques dans un grand système de base de données ; les déclencheurs sont un type spécial de procédures stockées ; les déclencheurs sont différents des procédures stockées, et les déclencheurs sont principalement exécutés par déclenchement ; les événements et les procédures stockées peuvent être appelées directement via le nom de la procédure stockée.

La différence entre les procédures stockées et les déclencheurs MySQL

Procédure stockée : il s'agit d'un ensemble d'instructions SQL utilisées pour exécuter des fonctions spécifiques dans les grands systèmes de bases de données. Déclencheur : Le déclencheur est un type spécial de procédure stockée. Il est différent de la procédure stockée. Le déclencheur est principalement déclenché par des événements et exécuté, tandis que la procédure stockée peut être appelée directement via le nom de la procédure stockée.

Procédure stockée :
se trouve dans un grand système de base de données,
un ensemble d'instructions SQL pour remplir des fonctions spécifiques,
est stocké dans la base de données, et après le first Il n'est pas nécessaire de recompiler lors d'un nouvel appel après la première compilation
L'utilisateur l'exécute en spécifiant le nom de la procédure stockée et en donnant des paramètres (si la procédure stockée a des paramètres).
La procédure stockée est un objet important dans la base de données

Avantages :
1 permet une programmation modulaire (créer une fois et utiliser plusieurs fois)
2 permet une exécution plus rapide
3 réduit le trafic réseau
4 meilleurs mécanismes de sécurité

Format :

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

Processus d'appel :

Utiliser le nom du processus d'appel ( )

pour afficher toutes les procédures de stockage afficher l'état de la procédure ;
Afficher la procédure stockée créée show create procédure nom de la procédure ;
Supprimer la procédure supprimer le nom de la procédure

In signifie que les paramètres sont transmis de l'extérieur et utilisés à l'intérieur (utilisés à l'intérieur du processus)
Out signifie que le paramètre enregistre les données dans la variable du processus et les donne à l'extérieur pour utilisation. Si la variable entrante elle-même contient des données à l'extérieur, alors après être entrée dans le processus, la variable entrante elle-même contient des données. première chose Il est effacé et défini sur null
Les données Inout peuvent être transmises de l'extérieur au processus pour un usage interne. En même temps, après l'opération interne, les données seront renvoyées vers l'extérieur

déclencheur Déclencheur :

Le déclencheur est un type spécial de procédure stockée, qui est différent de la procédure stockée

Le déclencheur est principalement déclenché par des événements et exécuté, tandis que les procédures stockées peuvent être exécutées via Le nom de la procédure stockée est appelé directement.

Fonction :

1. Peut forcer la vérification ou la conversion des données avant d'écrire dans la table de données
2 Lorsqu'une erreur de déclenchement se produit, le résultat de la modification sera annulé
format

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

Objet déclencheur : sur la table pour chaque ligne. La liaison du déclencheur concerne essentiellement toutes les lignes du tableau, donc lorsque chaque ligne change, le déclencheur sera déclenché

Minutage du déclencheur : correspondant à chaque table. . Les lignes auront des états différents. Lorsque la commande SQL est exécutée,

fera changer les données de la ligne. Chaque ligne aura toujours deux états. Avant d'exploiter les données (avant), après les données d'exploitation (après)
Événements déclencheurs :
La cible des déclencheurs dans Mysql est la modification des données, et les opérations correspondantes sont uniquement (ajouter, supprimer, modifier) ​​des requêtes qui ne font pas générer des données Change,
Il n'y a donc pas d'événement déclencheur dans la requête
Remarque :
Dans une table, il ne peut y avoir qu'un seul type de déclencheur correspondant à l'événement déclencheur lié à chaque timing de déclenchement ;
Il ne peut y en avoir qu'un dans une table Un déclencheur après insertion Par conséquent, le nombre maximum de déclencheurs dans une table ne peut être que six

Créer une procédure stockée

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");

Créer un déclencheur

创建两张表
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);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn