触发器中的DELIMITER //是用来做什么的?

43
DELIMITER //

这有什么用途?
6个回答

86
它将语句分隔符从;更改为//。这是为了能够在触发器定义中写入;而不被MySQL客户端误解为表示已结束。
请注意,当切换回来时,应使用DELIMITER ;,而不是我看到有人试图使用的DELIMITER;

35
在SQL中,每个语句都以分号(;)作为分隔符来结束。在触发器中,您需要编写多个语句,并且每个语句都必须以分号结尾。为了告诉MySQL这些分号并不是触发器语句的结束符号,您需要将分隔符从;暂时更改为//,这样MySQL就会知道只有在遇到//时,触发器语句才会结束。

4
我认为你表达得比被接受的答案更清晰! - Henrik Erlandsson
这就是我在寻找的答案。谢谢! - AbdulelahAGR

8

添加一个例子:
当使用mysql shell命令时,我们使用分号;作为每个语句的结束符。然而,在某些情况下,如果我们想要构建存储过程和触发器,我们需要在这些语句中也添加分号;

delimiter //
create trigger log_students after insert on students
for each row
  begin
    insert into log_students(change_by, change_at) values(USER(), NOW());
  end//
delimiter ;

1

简单设置语句结束分隔符(标准的默认 SQL 中为 ; 分号)。 如果您想在 SQL 中使用 ;,或者您正在使用嵌入式 SQL(可能会导致混淆),更改字符可能会很有用。同样,在您的示例中使用 // 可能会导致嵌入式 SQL 混淆,或者您可能想在 SQL 中使用它。因此,只需使用 DELIMITER 设置适合您的应用程序和需求的分隔符即可。


0
下面的分隔符命令将默认分隔符;更改为//。*我的回答详细解释了分隔符。
DELIMITER //

所以,你可以使用//运行下面的SQL语句,但不能使用;
mysql> SELECT * FROM person//
+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | David |
+----+-------+

然后,如果你把分隔符//改回;
DELIMITER ;

然后,您可以使用;运行下面的SQL语句,但不能使用//
mysql> SELECT * FROM person;
+----+-------+
| id | name  |
+----+-------+
|  1 | John  |
|  2 | David |
+----+-------+

0

阅读(嗯嗯)mysql文档

delimiter 是你发送给 mysql 命令行客户端的每个命令的结束标记符。

delimiter 不仅与触发器相关,而且定义触发器和存储过程是一个强大的用例,因为你希望它们包含分号 (;),而分号是默认的 delimiter


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接