mysql中delimiter的使用

时间:2022-09-23 15:07:47


create trigger t_insertregion
before insert on domaindump
for each row
begin
     set new.sourceregion=(select region from ip_data where new.sourceip>ipstart and new.sourceip<ipend);
     set new.destinationregion=(select region from ip_data where new.destinationip>ipstart and new.destinationip<ipend);

end

我在MySQL 图形客户端下可以顺利运行。但是在 命令客户端(MySQL Command Line Client)下就会出错。最后找到原因是没有设置好 delimiter 的问题。默认情况下,delimiter “;” 用于向 MySQL 提交查询语句。在存储过程或触发器中每个 SQL 语句的结尾都有个 “;”,如果这时候,每逢 “;” 就向 MySQL 提交的话,当然会出问题了。于是更改 MySQL 的 delimiter,上面 MySQL 存储过程就编程这样子了:

delimiter //;   -- 改变 MySQL delimiter 为:“//”



drop trigger if exists t_insertregion //

create trigger t_insertregion

before insert on domaindump

for each row

begin

set new.sourceregion=(select region from ip_data where new.sourceip>ipstart and new.sourceip<ipend);

set new.destinationregion=(select region from ip_data where new.destinationip>ipstart and new.destinationip<ipend);

end//



delimiter ; // -- 改回默认的 MySQL delimiter:“;”





当然,MySQL delimiter 符号是可以*设定的,你可以用 “/” 或者“$$” 等。但是 MySQL 存储过程中比较常见的用法是

“//” 和 “$$”。上面的这段在 SQLyog 中的代码搬到 MySQL 命令客户端(MySQL Command Line

Client)却不能执行。



mysql> delimiter //; -- 改变 MySQL delimiter 为:“//”

mysql>

mysql>drop trigger if exists t_insertregion //

->create trigger t_insertregion

->before insert on domaindump

->for each row

->begin

-> set new.sourceregion=(select region from ip_data where new.sourceip>ipstart and new.sourceip<ipend);

-> set new.destinationregion=(select region from ip_data where new.destinationip>ipstart and new.destinationip<ipend);

->end//

->

-> delimiter ; // -- 改回默认的 MySQL delimiter:“;”

-> //

-> //

-> //

-> ;

-> ;

->

最后终于发现问题了,在 MySQL 命令行下运行 “delimiter //; ” 则 MySQL 的 delimiter 实际上是 “//;”,而不是我们所预想的 “//”。其实只要运行指令 “delimiter //” 就 OK 了。



 

mysql> delimiter //     -- 末尾不要符号 “;”

mysql>

mysql> drop trigger if exists t_insertregion //

Query OK, 0 rows affected (0.00 sec)



mysql>create trigger t_insertregion

->before insert on domaindump

->for each row

->begin

-> set new.sourceregion=(select region from ip_data where new.sourceip>ipstart and new.sourceip<ipend);

-> set new.destinationregion=(select region from ip_data where new.destinationip>ipstart and new.destinationip<ipend);

->end//



Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ; -- 改回默认的 MySQL delimiter:“;”

delimiter 命令就是定义分隔符的意思

顺带一提的是,我们可以在 MySQL 数据库中执行在文件中的 SQL 代码。例如,我把上面存储过程的代码放在文件 d:/tr_doamindump.sql 中。可以运行下面的代码建立存储过程。

mysql> source d:/tr_doamindump.sql Query OK, 0 rows affected (0.00 sec)

source 指令的缩写形式是:“/.”

mysql> /. d:/tr_doamindump.sql Query OK, 0 rows affected (0.00 sec)