触发器使用

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 里面的值发生改变

添加表字段

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两条数据时候 相应的表数据减少两条

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值