觸發器:觸發器是一個特殊的存儲過程,它是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 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
更多內容