图形化工具: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
BEGIN
UPDATE `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)) THEN
BEGIN
-- 报告表,更新可合并编制标识
UPDATE REPORT SET REP_CANUNION = 1 WHERE rep_outerApplyId = outerApplyId;
-- 获取报告id
SELECT rep_Id INTO reportId FROM REPORT WHERE rep_outerApplyId = outerApplyId LIMIT 1;
-- 更新检验报告的合并报告id
UPDATE CHKREPORT SET RP_UNIONEDREPID = reportId WHERE rp_OuterApplyId = outerApplyId;
END;
END IF;
END;
-- 语句结束符 $$
$$
-- 将语句结束符更改为 ;【注意:DELIMITER后面必须有个空格,DELIMITER;并不是一条合法的sql语句】
DELIMITER ;
3、存储过程(无参数),创建、调用
-- 将语句结束符更改为 $$
DELIMITER $$
-- 如果存在该存储过程,则先删除。【注意:后面语句结束符为 $$】
DROP PROCEDURE IF EXISTS `WYLIMS`.`proc_Test`$$
-- 创建存储过程
CREATE PROCEDURE `WYLIMS`.`proc_Test`()
BEGIN
SELECT '这是无参存储过程' AS msg;
END;
-- 语句结束符 $$
$$
-- 将语句结束符更改为 ;【注意:DELIMITER后面必须有个空格,DELIMITER;并不是一条合法的sql语句】
DELIMITER ;
4、存储过程(有 in 参数),创建、调用
-- 将语句结束符更改为 $$
DELIMITER $$
-- 如果存在该存储过程,则先删除。【注意:后面语句结束符为 $$】
DROP PROCEDURE IF EXISTS `WYLIMS`.`proc_Test`$$
-- 创建存储过程
CREATE PROCEDURE `WYLIMS`.`proc_Test`(
IN id INT,
IN username VARCHAR(20))
BEGIN
SELECT '这是有输入参数的存储过程' AS msg;
END;
-- 语句结束符 $$
$$
-- 将语句结束符更改为 ;【注意:DELIMITER后面必须有个空格,DELIMITER;并不是一条合法的sql语句】
DELIMITER ;
5、 存储过程(有 in 、out 参数),创建、调用
-- 将语句结束符更改为 $$
DELIMITER $$
-- 如果存在该存储过程,则先删除。【注意:后面语句结束符为 $$】
DROP PROCEDURE IF EXISTS `WYLIMS`.`proc_Test`$$
-- 创建存储过程
CREATE PROCEDURE `WYLIMS`.`proc_Test`(
IN id INT,
IN username VARCHAR(20),
OUT mark VARCHAR(20))
BEGIN
SELECT '这是有输入输出参数的存储过程' AS msg;
END;
-- 语句结束符 $$
$$
-- 将语句结束符更改为 ;【注意:DELIMITER后面必须有个空格,DELIMITER;并不是一条合法的sql语句】
DELIMITER ;