實戰專案中常因細節生疏導致效能損耗或邏輯錯誤。本文系統整理觸發器全生命週期、LIKE/REGEXP 模糊匹配規則、存儲過程參數/變量/流程控制、以及 60+ 內建函數分類速查,作為開發隨手查閱手冊。
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON tbl_name FOR EACH ROW trigger_stmt
-- yyd_table 插入後,自動向 yyd_name 寫入固定值
CREATE TRIGGER yyd_tri AFTER INSERT ON yyd_table
FOR EACH ROW BEGIN
INSERT INTO yyd_name VALUES (NULL, 'name_yyd');
END;
CREATE TRIGGER yyd_tri1 BEFORE INSERT ON yyd_name
FOR EACH ROW BEGIN
SET NEW.name = '4';
END;
DROP TRIGGER yyd_tri;
觸發器內對同表再做 INSERT/UPDATE 會導致無限遞迴。錯誤寫法:
CREATE TRIGGER test BEFORE UPDATE ON test FOR EACH ROW
UPDATE test SET NEW.updateTime = NOW() WHERE id=NEW.ID; -- 觸發自身
正確寫法:直接 SET NEW.updateTime = NOW();,不再發動 DML。
| 符號 | 含義 | 範例 |
|---|---|---|
| % | 任意 0~n 字元 | LIKE '%三%' 匹配「張三」「三腳貓」 |
| _ | 任意單一字元 | LIKE '_三_' 仅匹配三字且中間為「三」 |
| [...] | 字元集合(類正則) | LIKE '[張李]三' 匹配「張三」「李三」 |
| [^...] | 排除字元集合 | LIKE '[^張]三' 排除「張三」 |
SELECT * FROM user WHERE u_name REGEXP '三|貓'; -- OR 邏輯 SELECT * FROM user WHERE u_name REGEXP BINARY 'JetPack.000'; -- 區分大小寫
DELIMITER //
CREATE PROCEDURE proc1(OUT s INT)
BEGIN
SELECT COUNT(*) INTO s FROM user;
END //
DELIMITER ;
IN:輸入參數,預設,內部修改不回傳;OUT:輸出參數,內部賦值可回傳;INOUT:雙向參數。DECLARE var_name TYPE [DEFAULT value]; SET var_name = expr; -- 會話變量(跨過程可見) SET @x = 'Hello'; SELECT @x;
區塊內同名變量遮蔽外層,離開區塊自動銷毀,需透過 OUT 參數或會話變量持久化。
-- IF-THEN-ELSE
IF condition THEN ... ELSEIF ... ELSE ... END IF;
-- CASE
CASE var WHEN 0 THEN ... WHEN 1 THEN ... ELSE ... END CASE;
-- WHILE
WHILE var < 6 DO ... END WHILE;
-- REPEAT (類 do-while)
REPEAT ... UNTIL condition END REPEAT;
-- LOOP + LEAVE/ITERATE
loop_label: LOOP
IF v >= 5 THEN LEAVE loop_label; END IF;
IF v = 3 THEN SET v=v+1; ITERATE loop_label; END IF;
...
END LOOP;
-- 查詢 SELECT name FROM mysql.proc WHERE db='dbname'; SHOW PROCEDURE STATUS WHERE db='dbname'; -- 刪除 DROP PROCEDURE proc_name;
CONCAT、INSTR、LEFT/RIGHT、LENGTH、LOCATE、LPAD/RPAD、LTRIM/RTRIM/TRIM、REPEAT、REPLACE、STRCMP、SUBSTRING、UCASE/LCASE、SPACE
ABS、BIN、CEILING/FLOOR、CONV、FORMAT、HEX、LEAST、MOD、POWER、RAND、ROUND、SQRT
ADDTIME、CONVERT_TZ、CURRENT_DATE/TIME/TIMESTAMP、DATE、DATE_ADD/SUB、DATE_FORMAT、DATEDIFF、DAY/DAYNAME/DAYOFWEEK/DAYOFYEAR、EXTRACT、MAKEDATE/MAKETIME、MONTHNAME、NOW、SEC_TO_TIME/TIME_TO_SEC、TIMEDIFF、WEEK、YEAR、HOUR/MINUTE/SECOND/MICROSECOND、LAST_DAY、STR_TO_DATE
CREATE TRIGGER ... BEGIN CALL showChildLst(NEW.pn, NEW.pa); END;