最近在使用mysql,刚刚接触触发器,在网上找了很多的触发器语句,有一些只有触发器没有表,我的编程习惯不好,出了很多低级错误,现在讲我对于触发器的一些基础知识记录下来。很简单,我在网上查询加上自己实际操作用了不到3个小时,一些基本的操作就会了,希望帮到和我一样的菜鸟。另外这是mysql的触发器,语法和其他数据库应该有些不同;第5部分的红色是一些注意事项,有部分是我走过的坑,请注意了。
1 创建两个表(我使用的是Navicat连接的数据库,SQL 语句都一样)
数据库叫做"studb"
1首先创建表‘s’,当我对另外一个表‘scd7’操作时,会对这个表进行操作(触发器)
CREATE TABLE "s" (
"a" char(10) COLLATE utf8_bin NOT NULL DEFAULT '',
"b" char(10) COLLATE utf8_bin DEFAULT NULL,
"c" int(10) DEFAULT NULL,
"d" int(10) DEFAULT NULL,
PRIMARY KEY ("a")
);
2 创建表‘scd7’
CREATE TABLE "scd7" (
"Sno" char(9) COLLATE utf8_bin NOT NULL DEFAULT '',
"Cno" char(4) COLLATE utf8_bin NOT NULL DEFAULT '',
"Grade" int(11) DEFAULT NULL,
PRIMARY KEY ("Sno")
);
2 开始创建触发器
第一个触发器:
CREATE TRIGGER `credit7`
BEFORE UPDATE ON `scd7`
FOR EACH ROW
BEGIN
INSERT into s VALUES(New.Sno,New.Cno,4,6);
END;
解释:创建名字叫做‘credit7’的触发器
CREATE TRIGGER `credit7`
解释:这个触发器事件是发上在更新scd7’之前的
BEFORE UPDATE ON `scd7`
解释:
FOR EACH ROW:触发器是行级
BEGIN 和END是触发器事件的结束开始,
insert:语句是插入到‘s’的语句
New.Sno:是你要插入的Sno的值
New.Cno:是你要插入的Cno的值
4和6 就不用说了,插入对应列的值
FOR EACH ROW
BEGIN
INSERT into s VALUES(New.Sno,New.Cno,4,6);
END;
3 接下来运行对表‘scd7’进行插入,然后在进行修改,就会出现‘s’被修改了。就不一一截图了
4查询与删除触发器的语句
删除触发器:数据库名称.触发器名称
DROP TRIGGER FROM studb.crite7
查询触发器:是TRIGGERS(有S),查询的数据库中的触发器
SHOW TRIGGERS from studb
5一些其他触发器
CREATE TABLE "scd1" (
"Sno" char(9) COLLATE utf8_bin NOT NULL DEFAULT '',
"Cno" char(4) COLLATE utf8_bin NOT NULL DEFAULT '',
"Grade" int(11) DEFAULT NULL,
PRIMARY KEY ("Sno","Cno")
);
CREATE TRIGGER `TRIGGER1` BEFORE UPDATE ON `scd1` FOR EACH ROW
BEGIN
DECLARE oldGrade INT(20);
set oldGrade=(SELECT Grade FROM scd1 WHERE Sno=NEW.Sno);
IF New.Grade>oldGrade THEN
INSERT into s VALUES(NEW.Sno,NEW.Cno,8,6);
END IF;
END
注意上图
1 这个是建立表'scd1'
2 BEGIN与EDN之间的语句,是分号隔开的(特别是END IF后面的分号,最开始忘了写了,一直报错)
3 上面触发器的意思是:在修改‘scd1’时,当修改的Grade列数据,大于修改前的Grade数据,向‘s’插入语句。。。
4 触发器只能删除,不能修改
5 请注意各个数据列的类型
6 由于都是向's'表操作,请注意不要让's'表的主健重复了,不然会报错,插入失败,这也可以在数据库操作时做一些有趣的设定。
CREATE TRIGGER `TRIGGER1` BEFORE INSERT ON `scd1` FOR EACH ROW
BEGIN
set NEW.Grade=27;
END
这个触发器的作用是,当要插入'scd1'时,将新的Grade设置为27,也就是做,你执行的插入语句,成功后,‘scd1’表中的Grate值会被默认为27