1
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
--你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。
创建触发器
修改命令结束符号,默认;
1 创建一个触发器名字为insert_on_guanliyuan 在增加guanliyuan表记录后自动将记录增加到guanliyuan1表中
mysql> CREATE TRIGGER insert_on_guanliyuan
-> AFTER INSERT ON guanliyuan
-> FOR EACH ROW
-> BEGIN
-> INSERT INTO guanliyuan1(username,sex,grade,dept) VALUES(new.username,new.sex,new.grade,new.dept);
-> END||
查看结果(guanliyuan1 表id未设置自增长)
2 创建用户授予权限且相关权限可再授予
grant select,update,insert on `test`.`guanliyuan` to `use4`@`localhost` identified by 'use4' WITH GRANT OPTION;
FLUSH PRIVILEGES;
创建cmd中以use4用户登陆并插入一条语句,也触发了insert_on_guanliyuan这个触发器
因为查询guanliyuan1 表权限不够,所以以root用户查询验证结果
以root用户查询
3 创建一个触发器,在向表中插入语句时候,如果grade小于等于40 则将分数改为60
因为use权限不够,所以重新赋权限
再次创建触发器时候成功创建
插入数据:
4 创建两个触发器,向学生表student_info 增加或者删除数据时候,学生数目统计表student_count值增加或者减少。
4.1 先创建表:
stu_no INT(11) NOT NULL AUTO_INCREMENT,
stu_name VARCHAR(255) DEFAULT NULL,
PRIMARY KEY(stu_no)
);
CREATE TABLE student_count(
student_count INT(11) DEFAULT 0
);
4.2 创建触发器
3 验证
当往数据库增加信息的时候,student——count里面数值发生改变
当删除两条信息的时候,student_count 里面的值发生改变
5
添加表字段
alter table table1 add transactor varchar(10) not Null;
alter table table1 add id int unsigned not Null auto_increment primary key
5.2.修改某个表的字段类型及指定为空或非空
> alter table 表名称 change 字段名称 字段名称 字段类型 [是否允许非空];
> alter table 表名称 modify 字段名称 字段类型 [是否允许非空];
>alter table 表名称 modify 字段名称 字段类型 [是否允许非空];
5.3.修改某个表的字段名称及指定为空或非空
> alter table 表名称 change 字段原名称 字段新名称 字段类型 [是否允许非空
5.4如果要删除某一字段,可用命令:ALTER TABLE mytable DROP 字段 名;
6
在student_count 和student_info 表中分别增加年级字段student_class
0 表示全年级,1 表示1年纪。
ALTER TABLE student_count ADD student_class INT(4) DEFAULT 0;
ALTER TABLE student_info ADD student_class INT(4) DEFAULT 0;
清除表的内容
DELETE FROM student_count;
ALTER TABLE student_info;
初始化 student_count表的数据,设置7个年级,每个年级人数为0;
INSERT INTO student_count(student_count,student_class) VALUES(0,0);
INSERT INTO student_count(student_count,student_class) VALUES(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7);
删除原来的触发器
DROP TRIGGER trigger_student_count_insert;
DROP TRIGGER trigger_student_count_delete;
创建触发器,在INSERT时首先增加学生总人数,然后判断新增的学生是几年级的,再增加对应年级的学生总数:
mysql> CREATE TRIGGER trigger_student_info_delete
-> AFTER DELETE ON student_info
-> FOR EACH ROW
-> BEGIN
-> UPDATE student_count SET student_count = student_count - 1 WHERE student_class = 0;
-> UPDATE student_count SET student_count = student_count - 1 WHERE student_class = old.student_class;
-> END ||
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ||
mysql> CREATE TRIGGER trigger_student_info_insert
-> AFTER INSERT ON student_info
-> FOR EACH ROW
-> BEGIN
-> UPDATE student_count SET student_count = student_count + 1 WHERE student_class = 0;
-> UPDATE student_count SET student_count = student_count + 1 WHERE student_class = new.student_class;
-> END ||
Query OK, 0 rows affected (0.01 sec)
验证 插入数据
删除u两条数据时候 相应的表数据减少两条