触发器语法
在某个地方(表)发生了某些事件前或后,触发某些事件进行某些操作。
四要素
监视地点:表名
监听事件:insert
触发操作: update
触发时间:before/after
写触发器之前改变语句结束符号delimite $
语法:
Create trigger triggerName after/beforeinsert/update/delete on 表名
For each row#这句话是固定的
Begin
Sql语句,一句或多句
End;
如何在触发器中引用行的值
对于insert而言,新增的行用new 来表示,行中的每一列的值,用new.列名来表示
对于delete而言,删除的行用old来表示,行中每一列的值,用old.列名来表示。
对于update而言,修改前的数据用old表示,修改后的数据用new表示。
触发器里after和before的区别
After是先完成数据的增删改再触发。
触发的语句晚于监视的增删改,无法影响前面的增删改动作。
Before是先完成触发,再增删改。
触发的语句先于监视的增删改发生,我们有机会判断,修改即将发生的操作。
常用的表的引擎
Myisam 批量插入速度快,不支持事务,锁表
Innodb 慢,支持,锁行
事务
选用Innodb/bdb
通俗的说事务:指一组操作,要么都成功执行,要么都不执行-----》原子性
在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-----》隔离性
事务发生前和发生后,数据的总额依然匹配—》一致性
事务产生的影响不能够撤销------》持久性
如果出了错误,事务也不允许撤销,只能通过“补偿性事务”
开启事务 start transaction;
Commit 提交/rollback 回滚
注意:当一个事务commit,或者rollback就结束了。
有一些语句会造成事务的隐式提交,如starttransaction;
备份与恢复
系统运行中,增量备份与整体备份
例如:每周日整体备份一次,周一到六备份当天
备份工具
有第三方的收费备份工具
系统自带的mysqldump
Mysqldump –u root –proot test message>D:\\account.sql
导出多个库
Mysqldump –u root –proot -B 库1 库2 库3>地址/备份文件名
备份所有库
Mysqldump –u root –proot -A>地址/备份文件名
恢复
Source D:\\accont.sql 表级恢复先选库 use 库名;
Mysql –u root –proot [databaseName]<sql文件
索引分为普通索引,唯一索引,全文索引和主键索引
索引是针对数据所建立的目录,可以加快查询速度,降低了增删改的速度。
假设新闻表15列,10列上有索引,如何快读插入500w行数据
1,把空表的索引全部删除
2.导入数据
3数据导入完毕后,集中建立索引
索引的创建原则
1.不要过度索引
2.在where条件最频繁的列上加
3.尽量索引散列值
普通索引:index,仅仅是加快查询的速度。
唯一索引:unique index行上的值不能重复
主键索引:primary key不能重复,主键必唯一,但是唯一索引不一定是主键
一张表上只能有一个主键,但是可以用一个或多个唯一索引
全文索引:fulltext index select * from 表名 where match(全文索引名) against(‘china’)
全文索引不针对非常频繁的词做索引,如this,is,you,my等等,全文索引
查看一张表上所有索引
Show index from 表名
建立索引
Alter table 表名 add index 索引名(字段)
Alter table 表名 add primary key(列名)
存储过程
概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现,在封装的语句里面,可以用if/else,case,while等控制结构。可以进行sql编程。
查看现有的存储过程
Show procedure status
删除现有的存储过程
Drop procedure 存储过程的名字
调用存储过程
Call 存储过程名字();
Create procedure p3(n int,j char(1))
Begin
Ifj=’h’ then
Select* from g where num>n;
Else
Select* from g where num<n;
Endif;
End$