###索引 index 普通索引、唯一性索引、全文索引、单列索引、多列索引、空间索引。 1、添加索引 ```sql alter table 表名 add index 索引名(字段) ``` ```sql create index 索引名 on 表名(字段) ``` 2、删除索引 ```sql alter table 表名 drop index 索引名 ``` ```sql drop index 索引名 on 表名 ``` ```sql select name,age from user where id = 10; ``` where 后面的字段加索引,select 后面的字段不加索引。
### 事务 transaction 将多条 SQL 作为一个整体,要么全执行,要么一条都不执行。 张三和李四各有1000块钱,张三借给李四500块钱,用数据库来体现这一场景。 - 原子性:多条 SQL 语句是一个整体,不可再分割。 - 一致性:SQL 语句执行前后,数据库数据的值保持一致。 - 隔离性:一个事务的执行不能被其他事务所干扰。 - 持久性:一个事务一旦提交,数据库中数据的改变是永久的。 MySQL 是默认自动提交事务的,可以通过语句来查询是否开启了事务的自动提交 ```sql show variables like 'autocommit'; ``` 开启/关闭自动提交 ```sql set autocommit = 1/0; ``` 事务的操作: 1、开启事务 start transaction; 2、回滚 rollback; 3、提交 commit; ```sql start transaction; update people set money = 500 where id = 1; update people set money = 1500 where id = 2; rollback; ``` ```sql start transaction; update people set money = 500 where id = 1; update people set money = 1500 where id = 2; commit; ``` ### 视图 view 数据库中一张虚拟的表,允许不同用户或应用程序以不同的方式查看同一张表中的数据。 创建视图: ```sql create view view_common as select id,name from people; ``` 使用视图: ```sql select * from view_common; ``` 删除视图: ```sql drop view view_common; ``` ### 触发器 trigger 触发器定义了一系列操作,可以在对指定的表进行插入、更新或者删除操作的同时自动执行这些预先定义好的操作。 触发器的优点 - 开发更快,因为触发器存储在数据库中,所以不必编写每个触发器在应用程序中执行的操作。 - 更容易维护,定义好触发器之后,访问目标表,会自动调用触发器。 - 业务全局实现,如果修改业务,只需要修改触发器即可,不需要修改业务代码。 触发器的分类: - 前触发器:在更新、插入操作之前执行。 - 后触发器:在更新、插入、删除之后执行。 - Before delete触发器:在删除之前执行。 - Insted of 触发器:对复杂视图执行插入、更新和删除时执行。 ```sql create table tab1( tab1_id varchar(11) ); create table tab2( tab2_id varchar(11) ); ``` 创建触发器 ```sql create trigger t_afterinsert_on_tab1 after insert on tab1 for each row begin insert into tab2(tab2_id) values (new.tab1_id); end; ``` 删除触发器 ```sql drop trigger t_afterinsert_on_tab1; ``` ```sql create trigger t_afterdelete_on_tab1 after delete on tab1 for each row begin delete from tab2 where tab2_id = old.tab1_id; end; ``` ```sql drop trigger t_afterdelete_on_tab1; ``` ### 存储过程 procedure 存储过程是一组为了完成特定功能的 SQL 语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 一次编写,多次调用,避免开发人员重复编写相同的 SQL,存储过程是在数据库存储和执行的。可以减少客户端和服务器之间的数据传输,提高效率。 优点: - 模块化的程序设计,只需要创建一次存储过程,以后就可以在程序中调用该存储过程任意次。 - 执行速度更快,如果某操作需要执行大量的 SQL 语句或重复执行 SQL 语句,存储过程比普通的 SQL 语句执行更快。 - 更好的安全机制,对于没有权限执行存储过程的用户,也可以授权他们执行存储过程。 创建存储过程 ```sql create produce 存储过程名称(参数列表) routine_body ``` 参数列表:参数数据类型,参数名称,输入输出类型(in 入参,out 出参) ```sql create procedure add_name(in target int) begin declare name varchar(20); if target = 1 then set name = "MySQL"; else set name = "Java"; end if; insert into user(name) values (name); end; ``` ```sql call add_name(2); ``` ```sql drop procedure add_name; ``` ```sql create procedure count_of_user(out count_num int) begin select count(*) into count_num from user; end; ``` ```sql call count_of_user(@count_num); select @count_num; ``` ```sql drop procedure count_of_user; ```