儲存函數也是過程式物件之一,與預存程序相似。這些程式碼片段包含SQL和過程式語句,可以從應用程式和SQL中呼叫。然而,他們也有一些差異:
1、儲存函數沒有輸出參數,因為儲存函數本身就是輸出參數。
2、不能用CALL語句來呼叫儲存函數。
3、儲存函數必須包含一條RETURN語句,而這條特殊的SQL語句不允許包含於預存程序中
1、建立儲存函數
使用CREATE FUNCTION語句建立儲存函數
語法格式:
CREATE FUNCTION 儲存函數名稱([參數[,...]])
RETURNS 類型
函數本體
註:儲存函數不能擁有與預存程序相同的名字。儲存函數體中必須包含一個RETURN值語句,值為儲存函數的傳回值。
範例:建立一個儲存函數,當其傳回Book表中圖書數目作為結果
DELIMITER $$ CREATE FUNCTION num_book() RETURNS INTEGER BEGIN RETURN(SELECT COUNT(*)FROM Book); END$$ DELIMITER ;
RETURN子句中包含SELECT語句時,SELECT語句的傳回結果只能是一行且只能有一列值。即使儲存函數不需要參數,呼叫時也需要使用(),例如:num_book()。
範例:建立一個儲存函數來刪除Sell表中有但Book表中不存在的記錄
DELIMITER $$ CREATE FUNCTION del_sell(book_bh CHAR(20)) RETURNS BOOLEAN BEGIN DECLARE bh CHAR(20); SELECT 图书编号 INTO bh FROM Book WHERE 图书编号=book_bh; IF bh IS NULL THEN DELETE FROM Sell WHERE 图书编号=book_bh; RETURN TRUE; ELSE RETURN FALSE; END IF; END$$ DELIMITER ;
此儲存函數給定圖書編號作為輸入參數,先按給定的圖書編號到Book表查找看有沒有該圖書編號的書,如果沒有,回傳false,如果有,回傳true。同時也要到Sell表中刪除該圖書編號的書。若要列出資料庫中的預存程序,請使用SHOW FUNCTION STATUS指令即可。
2、呼叫儲存函數
儲存函數建立完後,呼叫儲存函數的方法和使用系統提供的內建函數相同,都是使用SELECT關鍵字。
語法格式:
SELECT 儲存函數名稱([參數[,...]])
範例:建立一個儲存函數publish_book,透過呼叫儲存函數author_book來獲得圖書的作者,並判斷該作者是否姓“張”,是則返回出版時間,不是則返回“不合要求”。
DELIMITER $$ CREATE FUNCTION publish_book(b_name CHAR(20)) RETURNS CHAR(20) BEGIN DECLARE name CHAR(20); SELECT author_book(b_name)INTO name; IF name like'张%' THEN RETURN(SELECT 出版时间 FROM Book WHERE 书名=b_name); ELSE RETURN'不合要求'; END IF; END$$ DELIMITER ;
呼叫儲存函數publish_book查看結果:
SELECT publish_book('電腦網路技術');
刪除儲存函數的方法並刪除存儲過程的方法基本上一樣,使用DROP FUNCTION語句
語法格式:
DROP FUNCTION [IF EXISTS]儲存函數名稱
##:IF EXISTS子句是MySQL的擴展,如果函數不存在,它防止錯誤
#例:刪除儲存函數a
DROP FUNCTION IF EXISTS a;
3、建立觸發器
使用CREATE TRIGGER語句建立觸發器
語法格式:
CREATE TRIGGER 觸發器名稱觸發時間觸發事件
ON 表名FOR EACH ROW 觸發器動作
#觸發器有兩種觸發選項:BEFORE和AFTER,分別表示觸發器是在啟動它的語句之前或之後被觸發。通常使用AFTER選項來在啟動觸發器後執行語句。 BEFORE選項用於驗證新資料是否符合使用限制。
包含SELECT語句的觸發器會傳回結果到客戶端,為了避免這種情況,應該避免在觸發器定義中使用SELECT語句。同樣,也不能呼叫將資料傳回客戶端的預存程序。
範例: 建立一個表table1,其中只有一列a,在表上建立一個觸發器,每次插入操作時,將使用者變數str的值設為TRIGGER IS WORKING。
CREATE TABLE table1(a INTEGER); CREATE TRIGGER table1_insert AFTER INSERT ON table1 FOR EACH ROW SET@str='TRIGGER IS WORKING';
要查看資料庫中有哪些觸發器可以使用SHOW TRIGGERS指令。
在MySQL觸發器中的SQL語句可以關聯表中的任意欄位。但不能直接使用列的名稱去標誌,那會使系統混淆,因為啟動觸發器的語句可能已經修改、刪除或新增了新的列名,而列的舊名同時存在。必須使用這種語法來識別:NEW.column_name或OLD.column_name。 NEW.column_name用來引用新行的一列,OLD.column_name用來引用更新或刪除它之前的已有行的一列。
對於INSERT語句,只有NEW是合法的,對於DELETE語句,只有OLD才合法。而UPDATE語句可以與NEW和OLD同時使用。
建立一個觸發器,使得當刪除表格「Book」中某本圖書的資訊時,同時刪除所有與該圖書有關的「Sell」表格中的資料。
DELIMITER $$ CREATE TRIGGER book_del AFTER DELETE ON Book FOR EACH ROW BEGIN DELETE FROM Sell WHERE 图书编号=OLD.图书编号; END$$ DELIMITER ;
當觸發器要觸發的是表本身的更新操作時,只能使用BEFORE觸發器,而AFTER觸發器將不被允許。
4、在觸發器中呼叫預存程序
例:假設Bookstore資料庫中有一個與Members表結構完全一樣的表member_b,建立一個觸發器,在Members表中加入數據的時候,呼叫預存程序,將member_b表中的資料與Members表同步。
1、定義預存程序:建立一個與Members表結構完全一樣的表格member_b
DELIMITER $$ CREATE PROCEDURE data_copy() BEGIN REPLACE member_b SELECT * FROM Members; END$$
2、建立觸發器:呼叫儲存程序data_copy()
DELIMITER $$ CREATE TRIGGER members_ins AFTER INSERT ON Members FOR EACH ROW CALL data_copy(); DELIMITER ;
5 、刪除觸發器
語法格式:
##DROP TRIGGER 觸發器名稱範例:刪除觸發器members_ins
DROP TRIGGER members_ins;
以上是MySQL中儲存函數建立與觸發器設定的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL異步主從復制通過binlog實現數據同步,提升讀性能和高可用性。 1)主服務器記錄變更到binlog;2)從服務器通過I/O線程讀取binlog;3)從服務器的SQL線程應用binlog同步數據。

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL的安裝和基本操作包括:1.下載並安裝MySQL,設置根用戶密碼;2.使用SQL命令創建數據庫和表,如CREATEDATABASE和CREATETABLE;3.執行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.創建索引和存儲過程以優化性能和實現複雜邏輯。通過這些步驟,你可以從零開始構建和管理MySQL數據庫。

InnoDBBufferPool通過將數據和索引頁加載到內存中來提升MySQL數據庫的性能。 1)數據頁加載到BufferPool中,減少磁盤I/O。 2)臟頁被標記並定期刷新到磁盤。 3)LRU算法管理數據頁淘汰。 4)預讀機制提前加載可能需要的數據頁。

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

全表掃描在MySQL中可能比使用索引更快,具體情況包括:1)數據量較小時;2)查詢返回大量數據時;3)索引列不具備高選擇性時;4)複雜查詢時。通過分析查詢計劃、優化索引、避免過度索引和定期維護表,可以在實際應用中做出最優選擇。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中