1.存储引擎选择
InnoDB:支持事务,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
2.触发器
触发器语法
create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发器时机,取值BEFOR或AFTER;
trigger_event:标识触发器事件,取值为INSERT,UPDATE或DELETE;
tbl_name:标识建立触发器的表名,即在哪一张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用BEGIN和END包含的多条语句
注:不能在一个表上建立两个相同类型的触发器
tigger_event
注:load data和replace语句可以引起触发器,load data相当于一系列的insert操作,ireplace则相当于删除后插入数据
语法
begin [statement_list] end;
statement_list:相当于一个或者多个语句的列表,列表内的每条语句需以;来结尾
需要使用delimiter命令(定界符,分隔符),是一条命令,不需要语句结束标识,语法为:
DELIMITER new_delemiter
new_delemiter可以设为1个或多个长度的符号,默认为分号(;)可修改为管道符,如:delimiter |
在此之后的语句,以分号结束,解释器不会有什么反应,只有遇到管道符才认为是语句结束。使用完成后还需将其修改回来
eg.
DELIMITER | create trigger tri_stuInsert after insert on student for each row begin declare c int; set c = (select stuCount from class where classID=new.classID); update class set stuCount = c + 1 where classID = new.classID; end| DELIMITER ;
触发器变量:
①变量
可以使用DECLARE定义一个局部变量,该变量只能在begin……end符合语句中使用,并且应该定义在符合语句的开头
语法:
DECLARE var_name[,...] type [DEFAULT value]
其中:
var_name为变量名称,与SQL相同,变量名称不区分大小写;
type 为MYSQL支持的任何数据类型;
可同时定义多个同类型的变量,用逗号隔开
变量初始值未NULL,就可以使用DEFAULE子句提供默认值,值可以被指定为一个表达式
对变量赋值采用SET语句,语法为
SET var_name = expr [,var_name = expr] ...
②NEW与OLD
触发器的所在表中,触发了触发器的那一行数据。
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用
③查看触发器
show triggers [From schema_name];
schema_name即Schema的名称,在MYSQL中与database是一样的,也就是说,可以指定数据库名
④删除触发器
drop trigger [if exises] [schema_name.]trigger_name
⑤触发器的执行顺序
数据库一般建立为Innob数据库,其上建立的表是事务性的,也就是事务安全的可以进行回滚事务
注:MySQL回滚事务有,如果before触发器执行失败,SQL无法正确执行;SQL执行失败时,after型触发器不会触发;after类型的触发器执行失败,SQL会回滚;