1.触发器
触发器是与表有关的数据库对象,在满足条件时触发,并执行触发器中定义的语句集合(协助应用在数据库端确保数据的完整性)
1.1创建触发器
触发器只能创建在永久表(permanent table)上,不能对临时表(Temporary Table)创建触发器
create trigger trigger_name trigger_time trigger_event
ON tbl_name for each row trigger_statement
//trigger_time是触发器的触发时间,可以是before或after
before:检查约束前触发
after:检查约束后触发
trigger_event:触发事件:可以是insert, update, delete
对同一个表相同触发时间的相同触发事件,只能定义一个触发器。
例如,对某个表的不同字段的after更新触发器,在MySQL中,只能定义成一个触发器,在触发器中通过判断更新的字段进行相对应的处理。
使用别名old和new来引用触发器中发生变化的记录内容。现在触发器只支持行级触发,不支持语句级触发。
//在样例数据库中,为film表创建了after insert 的触发器
delimiter $$
create trigger ins_film
after insert on film for each row begin
insert into film_text (film_id,title,description)
values (new.film_id,new.title,new.description);
end;
$$
delimiter ;
# 触发器
delimiter $
create TRIGGER ins_f1
AFTER #trigger time
INSERT # trigger event
ON
QY_adaboost
FOR EACH ROW BEGIN
UPDATE
QY_adaboost A
SET
A.train_f1 = 2*A.train_precision * A.train_recall / (A.train_precession + A.train_recall),
A.test_f1 = 2*A.test_precession * A.test_recall / (A.test_precession + A.test_recall);
end$
2.事务控制和锁定语句
MySQL支持对MyISAM和MEMORY存储引擎的表进行表级锁定;
BDB存储引擎的表进行页级锁定;
InoDB存储引擎的表进行行级锁定。
默认情况:表锁和行锁都是自动获得的,不需要额外的命令。
但是,有时,用户需要明确的进行锁表或者进行事务的控制,以便确保整个事务的完整性,这样就需要使用事务控制好锁定语句来完成。
2.1 lock table 和unlock table
lock tables可以锁定用于当前线程的表,如果表被其他线程锁定,则当前线程会等待,直到可以获取所有锁定为止。
unlock tables可以释放当前线程获得的任何锁定。当前线程执行另一个lock tables时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含的解锁,语法如下:
lock tables
tbl_name[as alias]{read [local]\[low_priority]write}
[,tbl_name[as alias]{read [local]\[low_priority]write}]...
unlock tables
2.2 事务控制
MySQL通过set autocommit,start transaction,commit和rollback等语句支持本地事务。
start transaction\begin[work]
commit[work][and [no] chain][[no] release]
rollback [work][and [no] chain][[no] release]
set autocommit={0\1}
//start transaction或begin语句可以开始一项新的事务
//commit和rollback用来提交或者回滚事务
//chain和release子句分别用来定义在事务提交或回滚之后的操作,chain会立即启动一个新事物,并且和刚才的事务具有相同的隔离级别,release则会断开和客户端的连接。
//set autocommit可以修改当前连接的提交方式,如果设置了set autocommit=0,则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。