当前位置:网站首页>MySQL高级指令

MySQL高级指令

2022-08-10 21:11:00 InfoQ

高级指令

索引

  • 索引类型



-- 查询索引
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

视图

视图算法



更新选项



-- 创建视图
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;

原网站

版权声明
本文为[InfoQ]所创,转载请带上原文链接,感谢
https://xie.infoq.cn/article/95f7bf90f63f59e60cef7da0d