MySQL学习笔记--触发器的创建与删除及使用注意事项

-----/*触发器*/
--满足触发条件时就会。自动执行。触发器中的语句,可以保证某些操作之间的一致性
--可以层叠更改,可以引用其他表中的列
--事前触发器可以获取事前之前和新的字段值,验证一些条件和进行一些准备操作,在表保存之前触发*/
--事后触发器是进行收尾工作,保证事务的完整性,在经表修改之后才能生效*/
--行级触发器是对DML语句影响的每个行执行一次,如UPDATE语句影响多行,就会对每行都激活一次触发器。
-----创建
--创建只有一个执行语句的触发器
 基本形式如下:
 create trigger 触发器名 before|after 触发事件 --触发事件可以为insert,update,delete
 on 表名 for each row 执行语句 
 例:
 create trigger dept_trig1 before insert
 on department for each row
 insert into trigger_time values(now());
 --补坑,创建trigger_time表
 drop table if exists tigger_time;--拼错了,少了一个‘r‘
 create table trigger_time(
  exec_time time
   )
 desc trigger_time
 --检查trigger效果
 select * from department;
 insert into department values(1004,‘销售部‘,‘负责产品销售‘,‘1号楼销售大厅‘)--报错,duplicate entry
 desc department --d_name是唯一性约束,不能取名‘销售部’
 insert into department values(1004,‘销售1部‘,‘负责产品销售‘,‘1号楼销售大厅‘)
 select table_schema from information_schema.tables where table_name=‘trigger_time‘ --查看trigger_time表属于什么库
 select * from trigger_time --查看trigger_time表是否被触发器更新,Ok 
 
 --创建有多个执行语句的触发器
 基本形式如下
 create trigger 触发器名 before|after 触发事件 --触发事件可以为insert,update,delete
   on 表名 for each row --在指定表上逐行触发
   begin
   执行语句1; 
   执行语句2; 
   .........;
   END
 /*MySQL默认以‘;‘最为整段执行语句结束标志,这里用delimiter &&进行转意成&&,&&表示整段语句结束,在IDE里面应该可以不用转意*/
 例:
 delimiter && 
 create trigger dept_trigzz after delete
 on department for each row
 begin
 insert into trigger_time values(‘21:01:01‘);
 insert into trigger_time values(‘22:01:01‘);
 end
 &&
 delimiter;
 show triggers
 
 --检查trigger效果
 delete from department where d_id=1004;
 select * from trigger_time--成功insert,ok
 
/*一个表在相同触发时间的相同触发事件,只能创建一个触发器*/
/*如department表中,触发事件Insert,触发事件为after的触发器只能有一个,但可以定义触发事件为Before的触发器*/
---查看触发器
---1.show triggers
show triggers --show triggers无法查询指定的触发器,只用于触发器较少的情况
---2.从triggers表中查看触发器信息
select * from information_schema.triggers where tigger_name=‘触发器名‘
---触发器的使用
--分别创建before insert和after insert两个触发器,比较执行顺序
--创建before insert触发器
create trigger before_insert before insert
on department for each row
insert into trigger_test values(null,‘before_insert‘);
--创建after insert触发器
create trigger after_insert after insert
on department for each row
insert into trigger_test values(null,‘after_insert‘);
--补坑,创建trigger_test表
create table trigger_test(id int auto_increment primary key,
info varchar(10)
);
--验证触发器
insert into department values(1004,‘销售1部‘,‘负责产品销售‘,‘1号楼销售大厅‘);
delete from department where id = ‘1004‘
desc department
delete from department where d_id = ‘1004‘
insert into department values(1004,‘销售1部‘,‘负责产品销售‘,‘1号楼销售大厅‘);--info字段报错,长度不够
--修改表中列的字段长度,
alter table trigger_test change column info info varchar(15); --change可以同时改表字段名与数据类型,但只修改字段长度时需重复一遍字段名
alter table trigger_test modify column info varchar(16);--modify只可以更改字段数据类型
--删除产生错误的插入列
delete from department where d_id = ‘1004‘
--重新插入
insert into department values(1004,‘销售1部‘,‘负责产品销售‘,‘1号楼销售大厅‘);
--验证触发器执行结果
select * from trigger_test --第一条记录为before_insert触发器激活后插入的‘before_insert’,第二条记录为after_insert触发器激活后插入的‘after_insert’,ok
/*FBI warning*/
/*触发器中不能包含事物处理的关键词如:start transaction,commit,rollback,也不能包含call语句*/
/*在触发器执行过程中,任何步骤出错都会阻止程序继续向下执行,但对产生触发事件的普通表来说,已经insert/delete/update过的记录是不能回滚的,更新过的数据将继续保持在表中*/
---删除触发器
基本形式:
drop trigger 触发器名
drop trigger 数据库实例名.触发器名 --触发器是属于数据库实例全局的
例:
drop trigger dept_trig1
--查询是否还存在
select * from information_schema.triggers where trigger_name=‘dept_trig‘ --查询无结果,Ok
/*FBI warning*/
/*当不再需要某个触发器时,一定要将这个触发器删除,否则会造成数据发生意料之外的变化*/
时间: 2024-10-14 19:05:34

MySQL学习笔记--触发器的创建与删除及使用注意事项的相关文章

MySQL学习笔记--索引的创建,删除

/*索引*/ /*索引设计原则 1.尽量选择唯一性索引 2.为经常需要order by,group by,distinct,union的字段设置索引 3.为常作为查询条件的字段设置索引 4.限制索引的数目 5.尽量使用数据量少的索引,索引值长,查询慢 6.尽量使用前缀来索引 7.删除不再使用的索引,或者很少使用的索引 */ /*一般来说,应该在这些列上创建索引,例如:        第一.在经常需要搜索的列上,可以加快搜索的速度:         第二.在作为主键的列上,强制该列的唯一性和组织表

mysql学习笔记-简介

1.数据存储方式3个阶段 1.人工管理阶段 2.文件系统阶段 3.数据库系统阶段 数据库组成 1.数据库由若干张表组成,表由若干个字段组成 2.关系数据库的表都是二维表 2.数据库泛型(创建数据库必须满足的要求) 1.第一范式(1NF):设计数据库满足的最低要求表中不能有重复字段,并且每个字段不能在拆分 3.数据库技术构成 1.数据库系统 2.sql语句 3.数据库访问技术等 4.sql语言分类 1.DDL(数据定义语言):主要用于创建表,视图,索引,触发器等.其中包括CREATE(创建表),A

MySql学习笔记(转载)

/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld --skip-grant-tables-- 修改root密码密码加密函数password()update mysql.user set password=password('root'); SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- /* 数据库操

MySQL学习笔记-自定义函数

MySQL学习笔记-自定义函数 1.自定义函数简介 自定义函数:用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同 自定义函数的两个必要条件:(1)参数  (2)返回值 自定义函数: 创建自定义函数 CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body 关于函数体: 1.函数体可以由合法的SQL语句构成: 2.函数体可以是

mysql学习笔记 第五天

使用分区数据表: 分区数据表和merge数据表具有相似的作用,但是分区数据表确确实实是一个数据表 ,不像merge是列出数据表的逻辑关系,并且分区数据表可以包括像myisam以外的 的数据表.创建分区数据表: create table 里给出数据列和索引,然后用partition by 定义一个用来把数据行分配 到各个分区的分区函数:[将数据表分成四个区] create table log_partition( dt datetime not null, info varchar(100) no

mysql学习笔记 第四天

mysql引擎: archive(档案)[数据插入以后不能被修改,只读] blackhole[这种写操作是删除数据,读操作是返回空白记录] CSV[在储存数据时以逗号作为数据项之间的分隔符] example[示例(存根)储存引擎] Falcon[用来进行处理事务的储存类型] federated[用来访问远程数据表的储存引擎] InnoDB[具备外键支持功能的事务处理引擎] memory[内存里的数据表] merge[用来管理多个MyISAM数据表构成的数据表集合(merg-myisam)] my

MySQL学习笔记-安装和基本操作

MySQL学习笔记-安装和基本操作   1.安装MySQL 1 # yum -y install mysql mysql-server mysql-devel 添加/etc/my.conf配置: 1 vi /etc/my.conf2 [mysqld]3 default-character-set=utf84 character_set_server=utf85 [client]6 default-character-set=utf8 2.启动和停止MySQL服务: # service mysql

MySQL学习笔记之五 有关数据表操作

MySQL在创建表的时候,创建一个.frm文件保存表和列定义.索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中.   一.用SHOW/ DESCRIBE语句显示数据表的信息 语法: SHOW TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于