高级指令
索引
- 索引类型
索引名称 | 索引类型 | 字段类型 | 备注 |
PRIMARY KEY | 主索引 | 主键 | 字段值不能重复,也不能为空。 |
INDEX | 普通索引 | 自定义字段 | 无,效率低。 |
UNIQUE | 唯一索引 | 自定义字段 | 字段值不能重复,效率高。 |
FULLTEXT | 文本索引 | 自定义字段 | 无,用于文本检索。 |
-- 查询索引 mysql> SHOW INDEX FROM student; -- 创建索引 mysql> CREATE [UNIQUE|FULLTEXT] INDEX idx_student_age -> [USING BTREE] -- 指定索引类型,默认 B+ 树 -> ON student(age); -- 指定索引属性 mysql> ALTER TABLE student ADD INDEX [idx_student_age](id,age); mysql> ALTER TABLE student ADD UNIQUE [uniq_student_age](age); mysql> ALTER TABLE student ADD FULLTEXE [ft_student_age](age); -- 删除索引 mysql> DROP INDEX idx_student_age ON student; mysql> ALTER TABLE student DROP INDEX idx_student_age; Copy to clipboardErrorCopied 复制代码
视图
视图算法
算法 | 名称 | 含义 |
UNDEFINED | 未定义(默认) | MySQL 自主选择相应的算法。 |
MERGE | 合并 | 视图的查询语句,与外部查询需要先合并再执行。 |
TEMPTABLE | 临时表 | 将视图执行完毕后形成临时表,再做外层查询. |
更新选项
算法 | 名称 | 含义 |
CACADED | 级联(默认) | 满足所有视图条件才能进行数据更新。 |
LOCAL | 本地 | 满足本视图条件就能进行数据更新。 |
-- 创建视图 mysql> CREATE VIEW view_student -> AS (SELECT * FROM student); mysql> CREATE ALGORITHM = MERGE -> VIEW view_student -> AS (SELECT * FROM student) -> WITH LOCAL CHECK OPTION; -- 查看结构 mysql> SHOW CREATE VIEW view_student; -- 删除视图 mysql> DROP VIEW [IF EXISTS] view_student; -- 修改视图结构(慎用) mysql> ALTER VIEW view_student -> AS (SELECT * FROM student);Copy to clipboardErrorCopied 复制代码
事务
开启事务后,所有输入的 SQL 语句将被认作一个不可分割的整体,在提交时统一执行。
如果在输入过程中出现问题,可以手动进行回滚。在输入过程中可以设置保存点。
-- 事务开启 mysql> START TRANSACTION; mysql> BEGIN; -- 事务提交 mysql> COMMIT; -- 事务回滚 mysql> ROLLBACK; -- 保存点 mysql> SAVEPOINT mypoint; -- 设置保存点 mysql> ROLLBACK TO SAVEPOINT mypoint; -- 回滚到保存点 mysql> RELEASE SAVEPOINT mypoint; -- 删除保存点Copy to clipboardErrorCopied 复制代码
InnoDB 存储引擎支持关闭自动提交,强制开启事务:任何操作都必须要 COMMIT 提交后才能持久化数据,否则对其他客户端不可见。
mysql> SET AUTOCOMMIT = 0|1; -- 0 表示关闭自动提交,1 表示开启自动提交。Copy to clipboardErrorCopied 复制代码
锁定
MySQL 可以手动对表/行锁定,防止其它客户端进行不正当地读取和写入。
-- 锁定 mysql> LOCK TABLES student [AS alias]; -- 解锁 mysql> UNLOCK TABLES;Copy to clipboardErrorCopied 复制代码
触发器
触发程序是与表有关的数据库对象,监听记录的增加、修改、删除。当出现特定事件时,将激活该对象执行 SQL 语句。
- MySQL 数据库只支持行级触发器:如果一条 INSERT 语句插入 N 行数据,语句级触发器只执行一次,行级触发器要执行 N 次。
- 在触发器中,可以使用
OLD
和NEW
表示该行的新旧数据。删除操作只有OLD
,增加操作只有NEW
。
-- 查看触发器 mysql> SHOW TRIGGERS; -- 创建触发器 mysql> CREATE TRIGGER my_trigger -> BEFORE INSERT -- 触发时间 BEFORE/AFTER 触发条件 INSERT/UPDATE/DELETE -> ON student -- 监听表必须是永久性表 -> FOR EACH ROW -- 行级触发器 -> BEGIN -> INSERT INTO student_logs(id,op,op_time,op_id) VALUES(null,'insert',now(),new.id) -> END; -- 删除触发器 mysql> DROP TRIGGER [schema_name.]trigger_name;