我正在编写SQL为数据库中的表创建触发器。这段代码应该放在一个脚本中,只要我们产生一个新数据库就可以运行该脚本。
我一直在阅读SQL文档,以了解如何执行此操作,最终想到了以下类型的查询:
DELIMITER $$
CREATE TRIGGER calendar_event_after_insert AFTER INSERT
ON calendar_event
FOR EACH ROW
BEGIN
IF @log_calendar_event_id = 'YES'
THEN
...
END IF;
IF @log_calendar_event_name = 'YES'
THEN
...
END IF;
...
END
$$
DELIMITER ;
现在,我在使用DELIMITER时遇到了错误,并且我承认我不太了解它是如何工作的。我的基本理解是,由于在这个大查询中有多个查询都以;
结尾,因此我需要使用另一个分隔符告诉sql该查询何时结束。
在阅读了一些关于定界符的内容后,这对我来说似乎是正确的语法,而且最重要的是,我一直在sequel pro中运行此查询,有时它有时会起作用(很奇怪,我知道)。
因此,最终我决定删除定界符部分,一切正常进行。我有点担心这会有副作用。
所以我的问题是:什么时候使用分隔符?它们对我有用吗?如果是这样,我在做什么错了?
根据评论的要求进行编辑
这是我在运行查询时遇到的错误:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本以使用正确的语法 在“ DELIMITER $$创建触发器附近” calendar_event_after_insert AFTER之后 在第1行上插入“日历”
仅供参考,我们在开发机上安装了旧版本的MYSQL-MYSQL 5.1.73
答案 0 :(得分:2)
DELIMITER
不是SQL语言的一部分。这是command中的official command-line tool:
如果使用mysql客户端程序定义包含分号字符的存储程序,则会出现问题。默认情况下,mysql本身会将分号识别为语句定界符,因此您必须临时重新定义定界符,以使mysql将整个存储的程序定义传递给服务器。
要重新定义mysql分隔符,请使用delimiter命令。
有些第三方程序也实现了delimiter
命令,以便能够运行复杂的MySQL脚本(例如HeidiSQL)。
如果您在不允许多个语句的上下文中运行脚本(例如,典型的PHP应用程序),则该命令将根本不存在,也根本不需要。