觸發器、函數、視圖、存儲過程?


觸發器:觸發器是一個特殊的存儲過程,它是MySQL在insert、update、delete的時候自動執行的代碼塊。

create trigger trigger_name
after/before insert/update/delete on 表名
for each row
begin
sql語句:(觸發的語句一句或多句)
end
DELIMITER $$
create trigger trigger_name
after insert on teacher
for each row
begin
insert into course(cname,teacher_id) values('數學',new.tid);
end$$
DELIMITER ;
示例一

*MySQL 的觸發器中不能對本表進行 insert、update 和 delete 操作,否則會報錯

 

 函數:MySQL中提供了許多內置函數,還可以自定義函數(實現程序員需要sql邏輯處理)

自定義函數:

創建:CREATE FUNCTION 函數名稱(參數列表)  
     RETURNS 返回值類型  
         函數體

調用:SELECT 函數名稱(參數列表)
修改: ALTER FUNCTION 函數名稱 [characteristic ...]
刪除:DROP FUNCTION [IF EXISTS] 函數名稱
操作函數
-- 1. 創建函數
create function fun_add(a int,b int)
returns int return a + b;
-- 2. 執行函數
select fun_add(1,1);
示例一
DELIMITER $$
CREATE FUNCTION rsum(n int) RETURNS int
    begin
        declare a int default 0;
        declare s int default 0;
        while a<n do
            set a = a+1;
            set s = s+a;
        end while;
        return s;
    end$$
DELIMITER ;
示例二

 

出錯信息:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
原因:

這是我們開啟了bin-log, 我們就必須指定我們的函數是否是

1 DETERMINISTIC 不確定的

2 NO SQL 沒有SQl語句,當然也不會修改數據

3 READS SQL DATA 只是讀取數據,當然也不會修改數據

4 MODIFIES SQL DATA 要修改數據

5 CONTAINS SQL 包含了SQL語句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的function指定一個參數。

解決方法:
SQL code
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name          | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF  |
+---------------------------------+-------+
mysql> set global log_bin_trust_function_creators=1;
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name          | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON  |
這樣添加了參數以后,如果mysqld重啟,那個參數又會消失,因此記得在my.cnf配置文件中添加:
log_bin_trust_function_creators=1
創建函數報錯

 

 

視圖:視圖是由查詢結果形成的一張虛擬表,是表通過某種運算得到的一個投影

create view view_name as select 語句

*視圖只是一條預編譯的SQL語句,並不保存實際數據 

mysql> select * from teacher,course where course.teacher_id = teacher.tid;
+-----+-----------------+-----+--------+------------+
| tid | tname           | cid | cname  | teacher_id |
+-----+-----------------+-----+--------+------------+
|   1 | 張磊老師        |   1 | 生物   |          1 |
|   2 | 李平老師        |   2 | 物理   |          2 |
|   3 | 劉海燕老師      |   3 | 體育   |          3 |
|   2 | 李平老師        |   4 | 美術   |          2 |
+-----+-----------------+-----+--------+------------+
4 rows in set (0.00 sec)

mysql> create view view_name as select * from teacher,course where course.teacher_id = teacher.tid;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+--------------------+
| Tables_in_homework |
+--------------------+
| class              |
| course             |
| score              |
| student            |
| teacher            |
| view_name          |
+--------------------+
6 rows in set (0.00 sec)

mysql> select * from view_name;
+-----+-----------------+-----+--------+------------+
| tid | tname           | cid | cname  | teacher_id |
+-----+-----------------+-----+--------+------------+
|   1 | 張磊老師        |   1 | 生物   |          1 |
|   2 | 李平老師        |   2 | 物理   |          2 |
|   3 | 劉海燕老師      |   3 | 體育   |          3 |
|   2 | 李平老師        |   4 | 美術   |          2 |
+-----+-----------------+-----+--------+------------+
視圖示例

 

存儲過程:把一段代碼封裝起來,當要執行這一段代碼的時候,可以通過調用該存儲過程來實現(經過第一次編譯后再次調用不需要再次編譯,比一個個執行sql語句效率高)

 create procedure 存儲過程名(參數,參數,…)
   begin
   //代碼
   end

call 存儲過程名(參數...)
#1. 准備表
create table s1(
id int,
name varchar(20),
gender char(6),
email varchar(50)
);

#2. 創建存儲過程,實現批量插入記錄
delimiter $$ #聲明存儲過程的結束符號為$$
create procedure auto_insert1()
BEGIN
    declare i int default 1;
    while(i<30)do
        insert into s1 values(i,'eva','female',concat('eva',i,'@oldboy'));
        set i=i+1;
    end while;
END$$ #$$結束
delimiter ; #重新聲明分號為結束符號

#3. 查看存儲過程
show create procedure auto_insert1\G 

#4. 調用存儲過程
call auto_insert1();
存儲過程可以有多個in,out,inout參數,而函數只有輸入參數類型,而且不能帶in.
存儲過程實現的功能要復雜一些;而函數的單一功能性(針對性)更強。
存儲過程可以返回多個值;存儲函數只能有一個返回值。
存儲過程一般獨立的來執行;而存儲函數可以作為其它sql語句的組成部分來出現。
存儲過程可以調用存儲函數。函數不能調用存儲過程。

作者:唯老
鏈接:https://www.jianshu.com/p/ffa593181ead
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
函數和存儲過程的區別

 

更多內容

https://blog.csdn.net/babycan5/article/details/82789099


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM