项目总结
一、项目概述
1.目的
通过过往学生介绍,老师项目作品展示,发布中的优质项目信息、以及企业内推岗位展示,来促进招生销售工作。便于项目的发布及报名相关管理工作。
2.产品概述
(1)用于发布项目及任务,供老师及学生报名参与。
(2)用于老师及学生进行个人过往项目展示。
(3)企业内推岗位展示。
3.组织结构
4.技术选型
技术 | 作用 |
---|---|
springboot | 容器+mvc框架 |
SpringSecurity | 认证和授权框架 |
MybatisPlus | orm框架 |
Elasticsearch | 搜索引擎 |
RabbitMQ | 消息队列 |
Redis | 分布式缓存 |
MongoDB | Nosql数据库 |
LogStash | 日志收集工具 |
Kibina | 日志可视化查看工具 |
Nginx | 静态资源服务器 |
Docker | 应用容器引擎 |
Jenkins | 自动化部署工具 |
Druid | 数据库连接池 |
oss | 对象存储 |
MinIO | 对象存储 |
JWT | JWT登录支持 |
Lombok | 简化对象封装工具 |
Hutool | Java工具类库 |
PageHelper | 物理分页插件 |
Hibernator-Validator | 验证框架 |
5.业务架构图
二、任务
1.登录 / 注册
2.账号管理
3.个人中心
4.接口设计
(1)用户管理
//登录
POST:user/login
//注册
POST:user/register
//分页
POST:user/query/page
//添加角色
POST:user/add/role
//查询单个
GET:user/{id}
//修改
PUT:user/{id}
//删除
DELETE:user/{id}
//查询所有
GET:user/query/list
//验证码
POST:user/password
//验证码登录
POST:user/password/verification
(2)角色管理
//分页查询
POST:role/query/page
//查询单个
GET:role/{id}
//新增
PUT:role/add
//修改
PUT:role/update
//删除
DELETE:role/{id}
//条件查询
POST:role/conditionalRole
5.表结构设计
用户表(user)
字段 | 数据类型 | 长度 | 约束 | 备注 |
---|---|---|---|---|
id | bigint unsigned | 默认 | 主键、自增 | 账户id |
name | varchar | 20 | 非空,默认为’’ | 账户姓名(默认游客用户填写手机号) |
phone_number | char | 11 | 非空,默认为’’ | 绑定的电话号码 |
password | varchar | 64 | 非空,默认为‘’ | 账户密码 |
varchar | 64 | 非空,默认为‘’ | 微信号 | |
skill | varchar | 200 | 非空,默认为‘’ | 擅长技能 |
project_info | varchar | 300 | 非空,默认为‘’ | 项目信息 |
daily_salary | int unsigned | 默认 | 非空,默认为0 | 日薪 |
working_year | unsigned tinyint | 默认 | 非空,默认为0 | 工作年限 |
is_verify | unsigned tinyint | 默认 | 非空,默认为0 | 审核状态0:未审核,1已审核 |
is_admin | unsigned tinyint | 默认 | 非空,默认为0 | 是否为超级用户:0不是1是 |
is_deleted | unsigned tinyint | 默认 | 非空,默认0 | 是否为逻辑删除:0否1是 |
portrait_url | varchar | 100 | 非空,默认为‘’ | 头像存储地址 |
create_time | datetime | 默认 | 非空 | 创建时间 |
update_time | datatime | 默认 | 非空 | 修改时间 |
角色表(role)
字段 | 数据类型 | 长度 | 约束 | 备注 |
---|---|---|---|---|
id | bigint unsigned | 默认 | 主键、自增 | 账户id |
name | varchar | 20 | 非空,默认为‘’ | 角色名字 |
role_description | varchar | 64 | 非空,默认‘’ | 角色描述 |
is_deleted | unsigned tinyint | 默认 | 非空,默认0 | 是否被逻辑删除:0否,1是 |
create_time | datetime | 默认 | 非空 | 创建时间 |
update_time | datetime | 默认 | 非空 | 更新时间 |
用户角色关联表(user_role)
字段 | 数据类型 | 长度 | 约束 | 备注 |
---|---|---|---|---|
id | bigint unsigned | 默认 | 主键、自增 | 账户id |
uid | bigint unsigned | 默认 | 非空,默认为0 | 用户id |
rid | bigint unsigned | 默认 | 非空,默认为0 | 角色id |
is_deleted | unsigned tinyint | 默认 | 非空,默认为0 | 是否被逻辑删除,0否1是 |
create_time | datetime | 默认 | 非空 | 创建时间 |
update_time | datetime | 默认 | 非空 | 修改时间 |
权限详情表(permission)
字段 | 数据类型 | 长度 | 约束 | 备注 |
---|---|---|---|---|
id | bigint unsigned | 默认 | 主键、自增 | 账户id |
name | varchar | 20 | 非空,默认为‘’ | 权限名字 |
permission_description | varchar | 64 | 非空,默认‘’ | 权限描述 |
url | varchar | 1000 | 非空,默认为‘’ | 权限地址 |
is_deleted | unsigned tinyint | 默认 | 非空,默认0 | 是否被逻辑删除:0否,1是 |
create_time | datetime | 默认 | 非空 | 创建时间 |
update_time | datetime | 默认 | 非空 | 修改时间 |
角色权限关联表(role_permission)
字段 | 数据类型 | 长度 | 约束 | 备注 |
---|---|---|---|---|
id | bigint unsigned | 默认 | 主键、自增 | 账户id |
rid | bigint unsigned | 默认 | 非空,默认为0 | 角色id |
pid | bigint unsigned | 默认 | 非空,默认为0 | 权限id |
is_deleted | unsigned tinyint | 默认 | 非空,默认0 | 是否被逻辑删除:0否1是 |
create_time | datatime | 默认 | 非空 | 创建时间 |
update_time | datetime | 默认 | 非空 | 修改时间 |
6.代码设计
(1)实体类
//用户实体类
@ApiModel(value = "User对象",description = "用户表")
public class User implements Serializable
//角色实体类
@ApiModel(value="Role对象",description = "角色表")
public class Role implements Serializable
//用户角色关联实体类
@ApiModel(value="UserRole对象", description="用户角色关联表")
public class UserRole implements Serializable
//权限详情实体类
@ApiModel(value="Permission对象", description="权限详情表")
public class Permission implements Serializable
//角色权限关联实体类
@ApiModel(value="RolePermission对象", description="角色权限关联表")
public class RolePermission implements Serializable
(2)持久层
public interface UserMapper extends BaseMapper<User> {
}
public interface RoleMapper extends BaseMapper<Role> {
}
public interface UserRoleMapper extends BaseMapper<UserRole> {
/**
* 根据用户 id 和角色 id 看是否有此关联关系
* @param uid 用户id
* @param rid 角色id
* @return 查询结果
*/
Long selectByUserIdAndRoleId(Long uid,Long rid);
/**
* 根据用户 id 和角色 id 添加用户角色关系
*
* @param uid 用户id
* @param rid 角色id
* @return 插入结果
*/
int insertUserAndRole(Long uid,Long rid);
}
public interface PermissionMapper extends BaseMapper<Permission> {
}
public interface RolePermissionMapper extends BaseMapper<RolePermission> {
}
(3)service层
public interface UserService extends IService<User>
public interface RoleService extends IService<Role>
public interface UserRoleService extends IService<UserRole>
public interface PermissionService extends IService<Permission>
public interface RolePermissionService extends IService<RolePermission>
(4)controller层
@RestController
@Api(tags = "userController", description = "用户管理")
@RequestMapping("/user")
public class UserController
@RestController
@Api(tags = "roleController", description = "角色管理")
@RequestMapping("/role")
public class RoleController
@RestController
@Api(tags = "permissionController", description = "权限管理")
@RequestMapping("/permission")
public class PermissionController
(5)通用返回对象
@Data
public class CommonResult<T> {
private long code;
private String message;
private T data;
(6)配置多数据源——MySQL主从复制,以及redis缓存。
@Cacheable(value = "selectRoleById", key = "'学员'+#id", unless = "#result==null")
@DS("slave")
//分别实现了向redis缓存中添加数据以及从不是默认数据源的从机slave中读取数据
读书笔记
一、MySQL数据库
- 认识MySQL数据库
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL主要有以下特性:
(1) 速度:运行速度快
(2) 价格:MySQL对多数个人用户来说是免费的
(3) 容易使用:与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习。
(4) 可移植性:能够在众多不同的系统平台上。
(5) 丰富的接口:提供了c,c++,java等的api
(6) 支持查询语言:MySQL可以利用标准SQL语法编写支持ODBC(开放式数据库连接)的应用程序。
(7) 安全性和连接性:十分灵活和安全的权限和密码系统,允许基于主机的验证。当连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全。由于MySQL是网络化的,因此可以在因特网上的任何地方访问,提高了数据共享的效率。
二、数据库
数据库是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。数据表之间相互关联,反映了客观事务间的本质联系。数据库系统提供对数据的安全控制和完整性控制。
- 认识数据库
(1) 数据库的原理:数据库是一些相关数据的集合,用户可以用一定的原则与方法添加、编辑和删除数据的内容,进而对所有数据进行搜索、分析及对比,取得可用的信息,产生所需的结果。
(2) 数据表:在关系型数据库中,数据库表是一系列二维数组的集合,用来存储数据和操作数据的逻辑结构。它由纵向的列和横向的行组成,行被称为记录,是组织数据的单位;列被称为字段,每一列表示记录的一个属性,都有相应的描述信息,例如数据类型、数据宽度等。
(3) 数据类型:数据类型决定了数据在计算机中的存储格式,代表不同的信息类型。常用的数据类型有整数数据类型、浮点数数据类型、精确小数类型、二进制数据类型、日期/时间数据类型、字符串数据类型。
(4) 主键:又称主码,用于唯一标识表中的每一条记录,用户可以定义表中的一列或者多列为主键,注意主键列上不能有两行相同的值,也不能为空值。 - 数据库技术构成
数据库系统由硬件部分和软件部分构成,硬件主要用于存储数据库中的数据,包括计算机、存储设备等;软件部分则主要包括dbms、支持DBMS运行的操作系统,以及支持多种语言进行应用开发的访问技术等。 - 数据库系统
数据库系统由以下3个主要组成部分:
(1) 数据库:用于存储数据的地方
(2) 数据库管理系统:用于管理数据库的技术
(3) 数据库应用程序:为了提高数据库系统的处理能力所使用的管理数据库的软件补充。
数据库提供了一个存储空间用于存储各种数据,可以将数据库视为一个存储数据的容器。一个数据库中可能包含许多文件,一个数据库系统中通常包含许多数据库。
数据库管理系统是用户创建、管理和维护数据库时所使用的软件,位于用户和操作系统之间,对数据库进行统一管理。DBMS能定义数据存储结构,提供数据的操作机制,维护数据库的安全性、完整性和可靠性。
数据库应用程序虽然已经有了DBMs,但是在很多情况下dbms无法满足对数据管理的要求。数据库应用程序的使用可以满足对数据管理的更高要求,还可以使数据管理过程更加直观和友好。数据库应用程序负责与dbms进行通信,访问和管理dbms中存储的数据,允许用户插入、修改、删除数据库的数据。 - SQL语句
SQL语言包含以下4部分:
(1) 数据定义语言(DDL):drop create alter等
(2) 数据操作语言(DML):insert,update,delete
(3) 数据查询语言(DQL):select
(4) 数据空值语言(DCL):grant,revoke,commit,rollback等。 - 三范式
(1) 第一范式:第一范式是第二和第三范式的基础,是最基本的范式。
数据组的每个属性只可以包含一个值
关系中的每个数组必须包含相同数量的值
关系中的每个数组一定不能相同。
(2) 第二范式:在第一范式的基础上,并且关系中的所有属性依赖于整个候选键。
(3) 非主键属性相互之间必须无关,并且依赖于键。
三、数据库的基本操作
- 创建数据库:create database database_name;database_name为要创建的数据库的名称,该名称不能与已存在的数据库重名。Show databases指令查看数据库列表中的数据库,默认7个数据库,这些数据库各有用途,其中MySQL是必须的,它记录用户访问权限,test数据库通常用于测试工作。
- 查看与选择数据库
使用show create database database_name可以查看指定的数据库。
使用use database_name可以选择数据库。 - 删除
删除数据库是将已经存在的数据从磁盘空间中消除,数据库中的所有数据也一起被删除。语法格式为:drop database database_name; - 数据库存储引擎
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据的操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同存储引擎还可以获得特定的功能。现在许多数据库管理系统支持多种数据引擎。MySQL的核心就是存储引擎。
MySQL存储引擎:MySQL提供了多种不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中不需要整个服务器中使用同一种存储引擎,可以针对具体的要求对每一个表使用不同的存储引擎。MySQL支持的存储引擎InnoDB,MyISAM,Memory,Merge,Archive等。用户可以使用show engines语句查看系统支持的引擎类型。 - InnoDB存储引擎
InnoDB是事务型数据库的首选引擎。支持事务安全表,支持行锁定和外键。MySQL默认的存储引擎为InnoDB,主要特点如下:
(1) InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。
(2) InnoDB是为处理巨大数据量时的最大性能设计,他的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
(3) InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持他自己的缓冲池。InnoDB的表和索引在一个逻辑表空间中,表空间可以包含数个文件。这与MYisam表不同,比如在myisam表中每个表被保存在放分离的问价中,InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2gb的操作系统上。
(4) InnoDB支持外键完整性约束。在存储表中的数据时每张表的存储都按主键顺序存放,如果没有显示地定义表时指定主键,InnoDB会为每一行生成一个6字节的rowid,并以此作为主键。
(5) InnoDB被用来在众多需要高性能的大型数据库站点上。InnoDB不创建目录。 - myisam存储引擎
myisam基于isam存储引擎,并对其进行扩展。他是在web、数据仓库和其他应用环境下最常使用的存储引擎之一。Myisam拥有较高的插入,查询速度,但不支持事务。主要特点如下:
(1) 大文件在支持大文件的文件系统和操作系统上被支持。
(2) 当把删除、更新及插入混合的时候,动态尺寸的行的碎片更少,这要通过合并相邻被删除的快来完成,若下一个被删除,则扩展到下一块自动完成。
(3) 每个myisam表的最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16个。
(4) 最大的键长度是1000字节,这也可以通过编译来改变。对于键长度超过250字节的情况,使用一个超过1024字节的键快。
(5) Blob和text列可以被索引
(6) Null值被允许在索引的列中,其占每个键的0-1字节。
(7) 所有数字键值先以高字节被存储,以允许一个更高的索引压缩。
(8) 对于每个表的auto_increment列,myisam通过insert和update操作自动更新这一列。这使得auto_increment列更快。
(9) 可以把数据文件和索引文件放在不同目录下。
(10) 每个字符列可以由不同的字符集
(11) 有varchar的表可以有固定或动态记录长度。
(12) Varchar和char列可以多达64kb. - memory存储引擎
memory存储引擎将表中的数据存储在内存中,为查询和引用其他表中的数据提供快速访问。主要特点:
(1) memory表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。
(2) memory存储引擎执行hash和btree索引
(3) 可以在一个memory表中有非唯一键
(4) Memory表使用一个固定的记录长度格式
(5) Memory不支持blob或text列。
(6) Memory支持auto_increment列和对可包含null值得索引。
(7) Memory表内容被存在内存中,内存是memory表和服务器在查询处理得空闲中创建得内部表共享
(8) memory表在所有客户端之间共享
(9) 当不在需要memory表得内容时要释放被memory表使用得内存,应该执行delete form或truncate table ,或者整个地删除表。
四、数据表的基本操作
- 创建数据表:语法形式:create table <表名>{字段名 数据类型 【列级约束条件】 【默认值】}
在使用create table 创建表时必须指定以下信息:
(1) 要创建表的名称,不区分大小写,不能使用SQL语言中的关键字
(2) 数据表中每一列的名称和数据类型,如果要创建多列,要用逗号隔开 - 主键约束
主键又称主码,是表中一列或者多列的组合。主键约束要求主键列的数据唯一,并且不允许为空。主键能够唯一标识表中的一条记录,可以结合外键类定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系就如同身份证和人之间的关系。主键分为两种类型:单字段主键和多字段主键
(1) 单字段主键:主键由一个字段组成,设置主键的SQL语句格式分为两种情况。
a. 字段名 数据类型 primary key
b. 在定义完所有列之后指定主键,语法格式如下:
Constraint<约束名> primary key 字段名
(2) 多字段主键
主键由多个字段联合组成,语法格式如下:
Primary key [字段1,字段2] - 外键约束
外键用来在两个表的数据之间建立连接,它可以是一列或者是多列。一个表可以有一个或者多个外键。外键对应的是参照完整性,一个表的外键可以为空值;若不为空,则每一个外键必须等于另一个表中的主键的值。
创建外键的语法格式如下:
Constraint<外键名> foreign key 字段名 references<主表名> 主键列
CONSTRAINT fk_emp_deptl FOREIGN KEY (deptid) REFERENCES tb_deptl (id) - 非空约束
非空约束指字段的值不能为空,对于使用了非空约束的字段,如果用户在添加数据的时候没有指定值,数据库系统会报错。
语法格式:字段名 数据类型 not null - 唯一性约束
唯一性约束要求某列唯一,允许为空,但只能出现一个空值。唯一性约束可以确保一列或者多列都不出现重复值。
语法格式:字段名 数据类型 unique - 默认约束
默认约束指定某列的默认值。
语法格式:字段名 数据类 default 默认值 - 自增属性
属性值自动增加的语法格式如下:
字段名 数据类型 auto_increment - 查看数据表基本结构
使用describe/desc语句可以查看表字段信息,包括字段名,数据类型,是否为主键,是否有默认值等。 - 查看数据表详细结构
Show create table语句可以用来查看表的详细信息。 - 修改表名
Alter table 旧表名 rename 新表名 - 修改字段数据类型
修改字段数据类型就是把字段的数据类型换成另一种数据类型。
语法格式:alter table 表名 modify 字段名 数据类型 - 修改字段名
语法格式:alter table 表名 change 旧字段名 新字段名 数据类型 - 添加字段
Alter table 表名 add 字段名 数据类型
First为可选参数,其作用是将新添加的字段设置为表的第一个字段;after为可选参数,其作用是将新添加的字段添加到已存在的字段名指定的字段后面。 - 删除字段
语法格式:alter table 表名 drop 字段名 - 修改字段排序
Alter table 表名 modify 字段 数据类型 first|alter 字段 - 更改表的存储引擎
语法格式:alter table 表名 engine=存储引擎名 - 删除表的外键约束
对于数据库中定义的外键,如果不需要,可以将其删除。外键一旦删除,就会解除主表与从表之间的关联关系。
语法格式:alter table 表名 drop foreign key 外键约束名 - 删除数据表
(1) 删除没有被关联的表
Drop table 可以一次删除一个或多个没有被其他表关联的数据表。语法:
Drop table 表1,表2,表3
(2) 删除被其他表关联的主表
取消表的外键约束关系,就可以删除主表
五、视图
视图是一个由查询语句定义数据内容的表,表中的数据内容就是SQL查询语句的结果集,行和列的数据均来自SQL查询语句中使用的数据表。之所以说视图是虚拟的表,是因为视图并不在数据库中真实存在,而是在引用视图时动态生成的。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中在存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动反映到视图中。
使用视图的优势:
(1) 使用视图简单,操作视图和操作数据表完全是两个概念,用户不用理清数据表之间复杂的逻辑关系,而且将经常使用的SQL数据查询语句定义为视图,可以有效地避免代码重复,从而减少工作量。
(2) 使用视图安全,用户只访问到视图给定的内容集合,这些都是数据表的某些列和行,避免用户直接操作数据表引发的一些列错误。
(3) 使用视图相对独立,应用程序访问是通过视图访问数据表,从而程序和数据表之间被视图分离。
(4) 复杂的查询需求:可以进行问题分解,然后创建多个视图获取数据,将视图联合起来就能得到需要的结果了。
(5) 在调用视图的时候才会执行视图中的SQL进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据,这样不会占用空间,由于是引用,视图的内容与真实表的内容是一致的。
- 创建视图
语法格式:create view view_name as select column_name from table_name
create VIEW em_view(name,buemen) as select employee.name,office.department from employee,office where employee.s_id = office.s_id; - 查看视图基本信息
Show table status like ‘视图名’ - 查看视图详细信息
Show create view 视图名 - 修改视图
Create or replace view 视图名 as select 语句
还可以使用alter view 视图名 as select 语句 - 更新视图
Update em_view set name=’’ where id =1; - 删除视图
DROP VIEW IF EXISTS e view
六、MySQL数据库查询语句详解
- 基本查询语句:
Select 字段列表 from 表名,表名 where 表达式 group by having order by limit
如果想去除结果中的重复行,可以使用distinct关键字。
七、索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以提高数据库中特定数据的查询速度。索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表中所有记录的引用指针。索引用于快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是减少查询操作时间的最佳路径。
- 索引的优点如下:
(1) 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
(2) 可以大大加快数据的查询速度这也是创建索引最主要的原因。
(3) 在实现数据的参考完整性方面可以加速表和表之间的连接。
(4) 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间。 - 索引的缺点如下:
(1) 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
(2) 索引需要占用磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大尺寸。
(3) 当对表中的数据进行增加、删除和修改的时候索引也要动态维护,这样就降低了数据的维护速度。 - 索引的分类
普通索引和唯一索引
(1) 普通索引:MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
(2) 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值。
单列索引和组合索引
(1) 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引。
(2) 组合索引:在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时索引才会被使用。使用组合索引遵循最左前缀集合。
全文索引
全文索引类型为full text,在定义索引的列上支持值得全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在char,varchar或者text类型得列上创建。在MySQL中只有myisam存储引擎支持全文索引。
空间索引
空间索引是对空间数据类型得字段建立得索引,MySQL中的空间数据类型有4中,分别是geometry point linestring和polygon。MySQL使用spatial关键字进行扩展,使得能够用与创建正规索引类似的语法创建空间索引。创建空间索引的列必须将其声明为notnull ,空间索引只能在存储引擎为myisam的表中创建。 - 创建索引
创建索引的语法格式如下:
CREATE TABLE table_name [col_name data_type] [UNIQUE FULLTf2 SPATIAL INDEXIKEY] [inde _l! ame] (col_name [length]) [ASC I DESC] - 删除索引
(1) 使用drop index删除索引的基本语法格式如下:
Drop index index_name on table_name;
(2) 使用alter table删除索引
语法格式:alter table table_name drop index index_name;
八、存储过程与存储函数
存储过程是一组为了完成特定功能的SQL语句集合。使用存储过程的目的是将常用或者复杂的工作预先用SQL语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。当以后需要数据库提供与已经好的存储过程的功能相同的服务时,只需调用call存储过程名称即可自动完成。
- 创建存储过程
创建存储过程需要使用create procedure语句,语法格式如下:
CREATE PROCEDURE sp_name ( [proc_parameter] ) [characteristic … ·] routine body
Proc_parameter指定存储过程的参数列表,列表形式如下:
【in | out | inout 】param_name type其中,in表示输入参数,out表示输出参数,inout表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型,该类型可以是数据库中的任意类型。Characteristic指定存储过程的特性。 - 调用存储过程
基本格式语法如下:
Call sp_name([parameter]),parameter为存储过程的参数
DELIMITER //
CREATE PROCEDURE avg_stude (in dep int, out avg float)
BEGIN
SELECT avg(sage) INTO avg
FROM student
WHERE did=dep;
end //
DELIMITER ;
Call avg_stude();
- 查看存储过程
SHOW CREATE PROCEDURE SP_NAME; - 删除存储过程
DROP PROCEDURE SP_NAME;
九、MySQL触发器
触发器是一个特殊的存储过程,不同的是执行存储过程要使用call语句来调用,而触发器的执行不需要使用call语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被MySQL自动调用。
例如:当对一个数据表进行插入、更新或删除等操作时可以激活触发器并执行触发器。触发程序经常用于加强数据的完整性约束和业务规则等等。触发器程序类似于约束,但比约束更灵活,具有更精细、更强大的数据控制能力。
触发程序的优点如下:
(1) 触发程序的执行是自动的,当对触发程序相关表的数据做出相应的修改后立即执行。
(2) 触发程序可以通过数据库中相关的表层叠修改另外的表。
(3) 触发程序可以实施比foreign key约束,check约束更为复杂的检查和操作。
- 创建触发器
创建一个触发器的语法格式如下:
CREATE TRIGGER trigger_name trigger_time trigger_event on tb1_name for eACH ROW trigger_stmt
create table newstudent(id int,name varchar(50));
create TRIGGER in_newstu BEFORE INSERT ON newstudent FOR EACH ROW SET @ss = NEW.id+1;
SET @ss=0;
INSERT INTO newstudent VALUES(1,'小李'),(2,'小张');
SELECT * FROM newstudent;
SELECT @ss;
delimiter //
create TRIGGER name_student
BEFORE INSERT
ON newstudent
FOR EACH ROW
BEGIN
IF new.id=3 THEN
SET new.name='同林';
END IF;
END //
delimiter;
INSERT INTO newstudent VALUES(3,'小刘');
SELECT * FROM newstudent;
- 查看触发器
通过show triggers查看触发器的语句如下:
Show triggers; - 删除触发器
使用drop trigger语句可以删除MySQL中已经定义的触发器,删除触发器的基本语法格式如下:
DROP TRIGGER [schema_name .][if EXISTS] trigger_name