Reference
MySQL触发器Trigger实例篇
mysql 中一个表可以建两个触发器吗?
Notes
- 用触发器可以实现表间数据的同步更新,在修改一个表后要连带修改一系列相关的表,可以用触发器实现;
- 在同一个表中,同类事件、且同个动作时间的触发器只能有一个。如对于表
table_1
,只能有一个after update
,但能同时存在before update
和after update
,也能同时存在after insert
和after delete
(见第二个链接里的回答); - 创建 trigger 时,需要先暂时将
delimiter
(界定符?结束符?)从默认的;
改成其它的,如/
,因为 trigger 里会有 SQL 语句,要用到;
,要避免它被认为是结束符; - 此例中每次创建 trigger 前都修改了
delimiter
,创建完又改回去(因为代码片是分开的),实际中可以先改一次,然后一次性创建完所有 trigger,再把delimiter
改回来; - MySQL 5.7.16 下测试通过
Example
Table
- 实现两个表:
teacher
和user
的同步更新 teacher
表字段:
- Tid,Teahcer ID,主键
- Tpsw,Teacher Password
CREATE TABLE teacher (
Tid VARCHAR(30) PRIMARY KEY,
Tpsw VARCHAR(40) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
user
表字段:
- Uid,User ID,主键
- Upsw,User Password
CREATE TABLE user (
Uid VARCHAR(30) PRIMARY KEY,
Upsw VARCHAR(40) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
teacher
表的Tid
字段与user
表的Uid
字段对应、Tpsw
与Upsw
对应
Trigger
- 触发器
insert_teacher
,实现在teacher
插入记录后,将新加的记录添加到user
表中
DELIMITER /
CREATE TRIGGER insert_teacher
AFTER INSERT ON teacher
FOR EACH ROW
BEGIN
INSERT user(Uid, Upsw) VALUES(NEW.Tid, NEW.Tpsw);
END
/
DELIMITER ;
- 触发器
update_teacher
,实现在修改teacher
表中一条记录的Tid
或Tpsw
后,在user
表中做出相应修改
DELIMITER /
CREATE TRIGGER update_teacher
AFTER UPDATE ON teacher
FOR EACH ROW
BEGIN
IF NEW.Tid != OLD.Tid OR NEW.Tpsw != OLD.Tpsw THEN
UPDATE user SET Uid = NEW.Tid, Upsw = NEW.Tpsw WHERE Uid = OLD.Tid;
END IF;
END
/
DELIMITER ;
- 触发器
delete_teacher
,实现删除teacher
表中的记录后,在user
中删除相应记录
DELIMITER /
CREATE TRIGGER delete_teacher
AFTER DELETE ON teacher
FOR EACH ROW
BEGIN
DELETE FROM user WHERE Uid = OLD.Tid;
END
/
DELIMITER ;