Appearance
MySQL 存储对象
1. 视图
语法:
SQL
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]视图检查选项:
WITH CASCADED CHECK OPTION:强制检查当前视图及其所有底层视图的WHERE条件(无论底层视图是否定义CHECK OPTION)。WITH LOCAL CHECK OPTION:仅检查当前视图的条件,若底层视图也定义了CHECK OPTION,则级联检查。
视图要支持更新(INSERT/UPDATE/DELETE),需满足以下条件:
- 基于单表:视图必须直接映射到单个基表(不能是多个表的
JOIN或UNION); - 不包含以下元素:聚合函数(如
SUM/COUNT)、DISTINCT、GROUP BY、HAVING、LIMIT; - 不使用子查询:
SELECT列表和FROM子句中不能有子查询; - 不引用临时表:视图定义不能基于临时表;
- 使用
MERGE算法:若视图使用ALGORITHM=TEMPTABLE(物化临时表),则不可更新;
2. 存储过程/函数
语法:
SQL
CREATE
[DEFINER = user]
PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE
[DEFINER = user]
FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
SQL routine查看:
SQL
-- 查询指定数据库中的存储过程/存储函数及状态信息
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'your_schema';
-- 查询某个存储过程/存储函数的定义
SHOW CREATE {PROCEDURE | FUNCTION} your_procedure_name;删除:
SQL
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name3. 触发器
语法:
SQL
CREATE
[DEFINER = user]
TRIGGER [IF NOT EXISTS] trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name一个可能令人困惑的例子是 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语法:对于每一行,BEFORE INSERT 触发器都会激活,然后根据是否存在重复键,触发 AFTER INSERT 触发器,或者同时触发 BEFORE UPDATE 和 AFTER UPDATE 触发器。
在触发器主体内,可以通过使用别名 OLD 和 NEW 来引用与触发器关联的表(即主题表)中的列。OLD.col_name 指的是在行被更新或删除之前的现有行的列。NEW.col_name 指的是要插入的新行的列,或者在行被更新之后的现有行的列。