# Mysql
## Mysql事务
### 原则
1. 只有使用了INNODB引擎的数据库或表才支持事务
2. 原子性:具备回滚机制,只有全部完成和全部不完成两种状态。
3. 一致性:事务开启前和结束后数据库完整性没有被破坏。
4. 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。防止事务同时执行期间交叉导致数据不一致。
5. 事务隔离级别:读未提交、读提交、可重复读和串行化
6. 持久性:事务处理结束后对数据的修改是永久的,即便系统故障也不会丢失。
### 事务控制语句
BEGIN或START TRANSACTION显式地开启一个事务。
COMMIT或COMMIT WORK可以提交事务,并对数据库的修改成为永久性。
ROLLBACK或ROLLBACK WORK,回滚会结束用户的事务,并撤回正在进行的所有未提交的修改。
SAVEPOINT identifier,SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT。
RELEASE SAVEPOINT identifier删除一个事务的保存点,当没有指定的保存点时,执行语句会抛出异常。
SET TRANSACTION 用来设置事务的隔离级别(READ UNCOMMITTED/READUNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE)。
### 事务处理方法:
用BEGIN.ROLLBACK,COMMIT来实现。
BEGIN或START TRANSACTION:用于开始一个事务。
ROLLBACK 事务回滚,取消之前的更改。
COMMIT 事务确认,提交事务,使更改永久生效。
## 主键
对于关系型数据库,有很重要得约束,就是两条数据不能完全重复,用于区别这两条数据的字段成为主键。
主键的选取原则就是:不使用和任何业务相关的字段作为主键。
主键分为自增整数类型和全局唯一GUID类型。
大多应用用自增整型即可满足,INT上限为21亿,BIGINT为922亿亿。
联合主键:可以多个字段设为主键,只要确保不是所有主键都重复即可。但是没有必要的情况尽量不使用联合主键,会使复杂度上升。
## 外键
ALTER TABLE *本表名*
ADD CONSTRAINI *外键名*
FOREIGN KEY *本表字段*
REFERENCES *外表(外表字段)*
## MYSQL索引
索引使一种数据结构,用于加快数据库查询的速度和性能。
索引分单列索引和组合索引,即一个索引只包含一个列或多个列。
创建索引时,需要确保索引应用在SQL查询语句的条件。
实际上索引也是一张表。
### 索引的使用:
CREATE INDEX *索引名称* ON *表名称*(*列名1* ASC/DESC,*列名2* ASC/DESC,...);
### 修改表结构
ALTER TABLE *已有的表名*
ADD INDEX *索引名称*(*列名1* ASC/DESC,*列名2* ASC/DESC,...);
### 创建表的时候直接指定
CREATE TABLE *表名* (*column1* data_type,*column2* data_type,...,
INDEX *索引名称* (*column1* [ASC|DESC], *column2* [ASC|DESC], ...));
### 删除索引
DROP INDEX 索引名称 ON *表名*;
### 唯一索引
CREATE UNIQUE INDEX *索引名称*
ON *表名*(*column1* [ASC|DESC], *column2* [ASC|DESC], ...);
### 修改表结构添加索引
ALTER table *表名*
ADD CONSTRAINT *索引名称* UNIQUE (*column1*, *column2*, ...);
### 创建表的时候直接指定
CREATE TABLE *表名* (
*column1* data_type,
*column2* data_type,
...,
CONSTRAINT *索引名称* UNIQUE (*column1* [ASC|DESC], *column2* [ASC|DESC], ...)
);