在 MySQL 資料庫開發中,存儲函數與觸發器是兩項強大且常被忽視的進階功能。它們能將業務邏輯封裝在資料庫層,提升效能、確保資料完整性,並減少應用程式與資料庫的往返通訊。本文將系統整理存儲函數與觸發器的建立、呼叫、修改、刪除語法,並搭配實戰範例,助你快速掌握核心用法。
CALL,必須在 SQL 表達式中以 SELECT func_name() 調用。RETURN value,否則會報錯。CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
sp_name:函數名稱,不可與存儲過程重名。func_parameter:僅含參數名與型別,無 IN/OUT/INOUT。RETURNS type:宣告返回值型別。routine_body:函數主體,允許流程控制、游標等,但必須有 RETURN。DELIMITER $$
CREATE FUNCTION NUM_OF_XS() RETURNS INTEGER
BEGIN
RETURN (SELECT COUNT(*) FROM XS);
END$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION DELETE_STU(XH CHAR(6)) RETURNS BOOLEAN
BEGIN
DECLARE STU CHAR(6);
SELECT 姓名 INTO STU FROM XS WHERE 學號 = XH;
IF STU IS NULL THEN
DELETE FROM XS_KC WHERE 學號 = XH;
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION IS_STU(XH CHAR(6)) RETURNS CHAR(10)
BEGIN
DECLARE NAME CHAR(8);
SELECT NAME_OF_STU(XH) INTO NAME;
IF NAME = '王林' THEN
RETURN (SELECT 出生日期 FROM XS WHERE 學號 = XH);
ELSE
RETURN 'FALSE';
END IF;
END$$
DELIMITER ;
SELECT NUM_OF_XS();DROP FUNCTION IF EXISTS NUM_OF_XS;ALTER FUNCTION sp_name [characteristic ...](修改主體需先刪除再建立)CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
trigger_time:BEFORE 或 AFTER。trigger_event:INSERT、UPDATE、DELETE。FOR EACH ROW:對每一受影響列執行。trigger_stmt:執行語句,多語句用 BEGIN ... END 包裹。注意:觸發器不可返回結果給客戶端,故定義中勿使用 SELECT 或呼叫返回結果的存儲過程。
| 事件 | 可用引用 |
|---|---|
| INSERT | NEW.column_name |
| DELETE | OLD.column_name |
| UPDATE | NEW.column_name、OLD.column_name |
DELIMITER $$
CREATE TRIGGER XS_DELETE AFTER DELETE ON XS FOR EACH ROW
BEGIN
DELETE FROM XS_KC WHERE 學號 = OLD.學號;
END$$
DELIMITER ;
驗證:DELETE FROM XS WHERE 學號='081101'; 再查詢 XS_KC 確認已級聯刪除。
DROP TRIGGER [schema_name.]trigger_name;
範例:DROP TRIGGER XS_DELETE;