69期-Java SE-034_MySQL-5 索引、事务、视图、触发器、存储过程

###索引 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;
```
原文地址:https://www.cnblogs.com/HiJackykun/p/11166779.html