数据存储:MYSQL之触发器/存储过程/存储函数

触发器

触发器的结构

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt;

        trigger_name:触发器的名称,由用户指定。

        trigger_time:触发器的执行时机,去BEFORE或AFTER,在某个行为前执行还是在某个行为后执行。

        tbl_name:指定触发器建立在哪张表上。

        trigger_stmt:触发器的执行动作,可以是一条SQL语句,也可以在BEGIN和END之间放置多个SQL语句。

触发器示例

-- 创建触发器
CREATE TRIGGER test_trigger BEFORE INSERT ON test1 FOR EACH ROW 
INSERT INTO test2(time) VALUES(NOW());

-- 触发器中使用插入的值
CREATE TRIGGER test_trigger2 AFTER INSERT ON test1 FOR EACH ROW 
INSERT INTO test3(id, msg) VALUES(new.id, new.msg);

-- 删除触发器
DROP TRIGGER test_trigger2;

-- 查询触发器
SHOW TRIGGERS;

触发器可以使用old或new来使用变动前或变动后的值。

经过测试,对sql性能并不会有太大影响,但是会增加数据库的复杂度,所以不推荐使用。

存储过程

存储过程的结构

CREATE PROCEDURE procedure_name([param_name[,...]]])
[characteristic ...]
procedure_stmt;

        procedure_name:存储过程的名字,由用户指定。

        param_name:存储过程的传入参数,可选项。

[ IN | OUT | INOUT ] param_name type

            IN:修饰的参数值由用户输入不会返回。

            OUT:修饰的参数值由存储过程传入会返回。

            INOUT:修饰的参数值由用户输入并传回。

        procedure_stmt:存储过程的执行动作,可以是一条SQL语句,也可以在BEGIN和END之间放置多个SQL语句。

        characteristic:可选项,指定存储函数的特性。该参数的取值与存储函数是一样的。

        characteristic的内容:

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

            COMMENT:注释,对于存储函数的描述。

            LANGUAGE:语言,默认是SQL,目前也仅支持SQL。

            DETERMINISTIC:是否确定性的输入就是确定性的输出。默认是NOT DETERMINISTIC。(如果函数总是对相同的输入参数产生相同的结果,那么就是确定的。)如果将不确定性的函数定义为确定性函数会导致结果和性能的不确定性。

            { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:表示存储函数的数据操作类型。这个性质只是建议性的。不会被服务器用作约束。

                CONTAINS SQL:表示不包含读取或写入数据的语句。例如:SET @x = 1。

                NO SQL:表示不包含SQL语句。

                READS SQL DATA:表示包含读取数据的语句,不包含写入数据的语句。(SELECT)

                MODIFIES SQL DATA:表示包含写入数据的语句。(INSERT/DELETE/UPDATE)

           SQL SECURITY:指定存储函数是以定义者的权限运行还是以运行者的权限运行。

                DEFINER为定义者权限。

                INVOKER为调用者权限。

存储过程示例

-- 创建存储过程
CREATE PROCEDURE test_procedure(IN c_id int, OUT ids int)
BEGIN
	 SELECT COUNT(*) INTO ids FROM test1 WHERE id < c_id;
END

-- 调用存储过程
SET @id_in = 20013;
SET @count_out = 0;
CALL test_procedure(@id_in, @count_out);
SELECT @count_out

-- 删除存储过程
DROP PROCEDURE test_procedure

-- 查询存储过程
SHOW PROCEDURE STATUS LIKE 'test_procedure';

-- 查询存储过程创建语句
SHOW CREATE PROCEDURE test_procedure;

存储函数

存储函数的结构

CREATE FUNCTION function_name ([param_name[,...]])
RETURNS return_type
[characteristic ...]
function_stmt

        function_name:存储函数的名字,由用户指定。

        param_name:存储函数的传入参数,可选项。

        return_type:存储函数的返回值类型。例如:varchar(20)。

        characteristic:可选项,指定存储函数的特性。该参数的取值与存储过程是一样的。

        function_stmt:存储函数的执行动作,可以是一条SQL语句,也可以在BEGIN和END之间放置多个SQL语句。

        characteristic的内容:

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

            COMMENT:注释,对于存储函数的描述。

            LANGUAGE:语言,默认是SQL,目前也仅支持SQL。

            DETERMINISTIC:是否确定性的输入就是确定性的输出。默认是NOT DETERMINISTIC。(如果函数总是对相同的输入参数产生相同的结果,那么就是确定的。)如果将不确定性的函数定义为确定性函数会导致结果和性能的不确定性。

            { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:表示存储函数的数据操作类型。这个性质只是建议性的。不会被服务器用作约束。

                CONTAINS SQL:表示不包含读取或写入数据的语句。例如:SET @x = 1。

                NO SQL:表示不包含SQL语句。

                READS SQL DATA:表示包含读取数据的语句,不包含写入数据的语句。(SELECT)

                MODIFIES SQL DATA:表示包含写入数据的语句。(INSERT/DELETE/UPDATE)

            SQL SECURITY:指定存储函数是以定义者的权限运行还是以运行者的权限运行。

                DEFINER为定义者权限。

                INVOKER为调用者权限。

存储函数示例

-- 创建存储函数
CREATE FUNCTION test_function() RETURNS VARCHAR ( 20 ) COMMENT '获取ID平均值' NOT DETERMINISTIC READS SQL DATA BEGIN
RETURN ( SELECT avg( id ) FROM test1 );
END

-- 调用存储函数
SELECT test_function();

-- 查询我们定义的存储函数,可以使用like来过滤函数名称。
SHOW FUNCTION STATUS;

-- 删除存储函数
DROP FUNCTION test_function;

-- 查询存储函数创建语句
SHOW CREATE FUNCTION test_function;

        当mysql开启了二进制日志功能,则DETERMINISTIC, CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA是必须指定的。

你可能感兴趣的:(MySQL,mysql,数据库,sql)