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)