mysql使用DELIMITER,创建触发器、存储过程、存储函数
图形化工具:SQLyog
软件官方网站:Webyog | Tools for MySQL and MariaDB Databases
软件下载地址:Downloads · webyog/sqlyog-community Wiki · GitHub
DELIMITER主要作用是改变语句结束符。默认情况下,MySQL使用分号 ; 作为语句结束符。
然而,在编写存储过程、函数或触发器等复杂SQL代码时,我们可能需要在代码块中使用分号来结束单个SQL语句。这时候就需要DELIMITER命令来临时改变默认的语句结束符。
1、创建触发器,简单示例
-- 将语句结束符更改为 $$
DELIMITER $$
-- 如果存在该触发器,则先删除。【注意:后面语句结束符为 $$】
DROP TRIGGER IF EXISTS `WYLIMS`.`trig_EMPLOYEE_Insert`$$
-- 创建触发器
CREATE TRIGGER `WYLIMS`.`trig_EMPLOYEE_Insert`
AFTER INSERT
ON `WYLIMS`.`EMPLOYEE`
FOR EACH ROW
BEGINUPDATE `ACCOUNT1` SET ACC_VALID = 1 WHERE 1 = 1;UPDATE `ACCOUNT2` SET ACC_VALID = 1 WHERE 1 = 2;UPDATE `ACCOUNT3` SET ACC_VALID = 1 WHERE 1 = 3;
END;
-- 语句结束符 $$
$$
-- 将语句结束符更改为 ;【注意:DELIMITER后面必须有个空格,DELIMITER;并不是一条合法的sql语句】
DELIMITER ;
2、创建触发器,复杂示例(有变量、有 if 判断)
-- 将语句结束符更改为 $$
DELIMITER $$
-- 如果存在该触发器,则先删除。【注意:后面语句结束符为 $$】
DROP TRIGGER IF EXISTS `WYLIMS`.`trig_CHKREPITEMTASKOFSAMLE_Update`$$
-- 创建触发器
CREATE TRIGGER `WYLIMS`.`trig_CHKREPITEMTASKOFSAMLE_Update`
AFTER UPDATE
ON `WYLIMS`.`CHKREPITEMTASKOFSAMLE`
FOR EACH ROW
BEGIN-- 定义变量DECLARE outerApplyId VARCHAR(20);DECLARE reportId INT;-- 变量赋值SELECT app_OuterApplyId INTO outerApplyId FROM APPLY WHERE APP_ID = new.rvt_ApplyId;-- 该受理编号不存在没有提交的样品项目(所有样品项目都已经提交)IF NOT EXISTS(SELECT RVT_ID FROM CHKREPITEMTASKOFSAMLE INNER JOIN APPLY ON APP_ID = RVT_APPLYID WHERE APP_OUTERAPPLYID = outerApplyId AND RVT_STATE IN(1,4)) THENBEGIN-- 报告表,更新可合并编制标识UPDATE REPORT SET REP_CANUNION = 1 WHERE rep_outerApplyId = outerApplyId;-- 获取报告idSELECT rep_Id INTO reportId FROM REPORT WHERE rep_outerApplyId = outerApplyId LIMIT 1;-- 更新检验报告的合并报告idUPDATE CHKREPORT SET RP_UNIONEDREPID = reportId WHERE rp_OuterApplyId = outerApplyId;END;END IF;
END;
-- 语句结束符 $$
$$
-- 将语句结束符更改为 ;【注意:DELIMITER后面必须有个空格,DELIMITER;并不是一条合法的sql语句】
DELIMITER ;