MySQL 触发器的操作

可以从information_schema架构下的系统表查看:
(1)查看约束: 
SELECT * FROM information_schema.`TABLE_CONSTRAINTS`;
(2)查看触发器:
SELECT * FROM information_schema.`TRIGGERS`;
  (3) 创建触发器 (增、改、删):

sys_user 表中插入、修改触发:

DROP TRIGGER IF EXISTS `sys_user_act_insert`;
DELIMITER $
CREATE TRIGGER `sys_user_act_insert` AFTER INSERT
ON `sys_user` FOR EACH ROW
BEGIN
DECLARE uname VARCHAR(50);
DECLARE pword VARCHAR(255);
DECLARE realname VARCHAR(255);
DECLARE eemail VARCHAR(255);
SET uname = (SELECT su.username FROM sys_user su WHERE su.id = new.id);
SET pword = (SELECT su.password FROM sys_user su WHERE su.id = new.id);
SET realname = (SELECT su.real_name FROM sys_user su WHERE su.id = new.id);
SET eemail = (SELECT su.email FROM sys_user su WHERE su.id = new.id);
INSERT `act_id_user`(`ID_`, `FIRST_`, `EMAIL_`, `PWD_`) VALUES (uname, realname, eemail, pword);
END$
DELIMITER;


DROP TRIGGER IF EXISTS `sys_user_act_update`;
DELIMITER $
CREATE TRIGGER `sys_user_act_update` AFTER UPDATE
ON `sys_user` FOR EACH ROW
BEGIN
DECLARE uname VARCHAR(50);
DECLARE pword VARCHAR(255);
DECLARE realname VARCHAR(255);
DECLARE eemail VARCHAR(255);
SET uname = (SELECT su.username FROM sys_user su WHERE su.id = new.id);
SET pword = (SELECT su.password FROM sys_user su WHERE su.id = new.id);
SET realname = (SELECT su.real_name FROM sys_user su WHERE su.id = new.id);
SET eemail = (SELECT su.email FROM sys_user su WHERE su.id = new.id);
UPDATE `act_id_user` actiu SET actiu.`FIRST_` = realname, actiu.`EMAIL_` = eemail, actiu.`PWD_` = pword WHERE actiu.`ID_` =  uname;
END$
DELIMITER;

sys_user 表中删除触发:

DROP TRIGGER IF EXISTS `sys_user_act_delete`;
DELIMITER $
CREATE TRIGGER `sys_user_act_delete` AFTER DELETE
ON `sys_user` FOR EACH ROW
BEGIN
DELETE FROM `act_id_user` WHERE ID_ =  old.username;
END$
DELIMITER;

(4)declare、set说明:

上面代码只是为了练习 使用declare 定义变量, set 给变量赋值的做法, 取值可以 直接从 new、 old中取

(5)Before与After区别:

before:(insert、update)可以对new进行修改,after: 不能对new进行修改,两者都不能修改old数据。

对于INSERT语句, 只有NEW是合法的;

对于DELETE语句,只有OLD才合法;

对于UPDATE语句,NEW、OLD可以同时使用。

after—是在记录操纵之后触发,是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;
before—是在记录操纵之前触发,是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作,如:我们在触发之前需要判断new值和old值的大小或关系,如果满足要求就触发,不通过就修改再触发;如:表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分,这里before相当于设置了断点,我们可以处理删除外键。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值