delimiter的作用是什么
分类:美高梅游戏官网网站

MYSQL导出叁个SQL后:
DELIMITER $$
DROP TRIGGER IF EXISTS `updateegopriceondelete`$$
CREATE
    TRIGGER `updateegopriceondelete` AFTER  DELETE ON  `customerinfo`
    FOR EACH ROW BEGIN
DELETE FROM egoprice  WHERE customerId=OLD.customerId;
    END$$
DELIMITER ;

中间DELIMITEEscort 定好得了符为"$$", 然后最后又定义为";", MYSQL的暗许停止符为";".


详尽表明:

骨子里就是告诉mysql解释器,该段命令是不是早就实现了,mysql是或不是能够举办了。
暗中同意景况下,delimiter是分号;。在命令行客商端中,借使有风度翩翩行命令以分集团甘休,
那么回车的前边,mysql将会推行该命令。如输入上面包车型客车口舌
mysql> select * from test_table;
下一场回车,那么MySQL将即时施行该语句。

但不经常,不希望MySQL这么做。在为大概输入相当多的言语,且语句中蕴藏有分号。
如试图在指令行顾客端中输入如下语句
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql>     RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql>     RETURN '';
mysql> ELSEIF N<15 THEN
mysql>     RETURN LEFT(S, N);
mysql> ELSE
mysql>     IF CHAR_LENGTH(S) <=N THEN
mysql>    RETURN S;
mysql>     ELSE
mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql>     END IF;
mysql> END IF;
mysql> END;
暗中认可景况下,不可能等到客商把那些话语全体输入完未来,再履行整段语句。
因为mysql一相遇分号,它将在自行施行。
即,在语句RETUSportageN '';时,mysql解释器将在实践了。
这种场地下,就供给事前把delimiter换来别的符号,如//或$$。
mysql> delimiter //
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql>     RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql>     RETURN '';
mysql> ELSEIF N<15 THEN
mysql>     RETURN LEFT(S, N);
mysql> ELSE
mysql>     IF CHAR_LENGTH(S) <=N THEN
mysql>    RETURN S;
mysql>     ELSE
mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql>     END IF;
mysql> END IF;
mysql> END;//
这般独有当//现身今后,mysql解释器才会试行这段语句

例子:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)

正文代码在 MySQL 5.0.41-community-nt 下运转通过。

编写了个总结网址访谈境况(user agent)的 MySQL 存储进度。正是下边包车型地铁这段 SQL 代码。

drop procedure if exists pr_stat_agent;

-- call pr_stat_agent ('2008-07-17', '2008-07-18')

create procedure pr_stat_agent
(
   pi_date_from  date
  ,pi_date_to    date
)
begin
   -- check input
   if (pi_date_from is null) then
      set pi_date_from = current_date();
   end if;

   if (pi_date_to is null) then
      set pi_date_to = pi_date_from;
   end if;

   set pi_date_to = date_add(pi_date_from, interval 1 day);

   -- stat
   select agent, count(*) as cnt
     from apache_log
    where request_time >= pi_date_from
      and request_time <  pi_date_to
    group by agent
    order by cnt desc;
end;

自己在 EMS SQL Manager 二〇〇六 for MySQL 这几个 MySQL 图形客户端下能够安枕而卧运作。不过在 SQLyog MySQL GUI v5.02 那个顾客端就能出错。最终找到原因是还未有设置好 delimiter 的难点。私下认可情状下,delimiter “;” 用于向 MySQL 提交查询语句。在累积进程中各类 SQL 语句的末梢都有个 “;”,如若此时,每逢 “;” 就向 MySQL 提交的话,当然会出难点了。于是改过MySQL 的 delimiter,上边 MySQL 存款和储蓄过程就编制程序那样子了:

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

drop procedure if exists pr_stat_agent //

-- call pr_stat_agent ('2008-07-17', '2008-07-18')

create procedure pr_stat_agent
(
   pi_date_from  date
  ,pi_date_to    date
)
begin
   -- check input
   if (pi_date_from is null) then
      set pi_date_from = current_date();
   end if;

   if (pi_date_to is null) then
      set pi_date_to = pi_date_from;
   end if;

   set pi_date_to = date_add(pi_date_from, interval 1 day);

   -- stat
   select agent, count(*) as cnt
     from apache_log
    where request_time >= pi_date_from
      and request_time <  pi_date_to
    group by agent
    order by cnt desc;
end; //

delimiter ; //   -- 改回暗中认可的 MySQL delimiter:“;”

本来,MySQL delimiter 符号是足以随意设定的,你能够用 “/” 恐怕“$$” 等。不过 MySQL 存款和储蓄进程中相比遍布的用法是 “//” 和 “$$”。上边包车型大巴这段在 SQLyog 中的代码搬到 MySQL 命令顾客端(MySQL Command Line Client)却无法实行。

mysql> delimiter //;     -- 改变 MySQL delimiter 为:“//”
mysql>
mysql> drop procedure if exists pr_stat_agent //
    ->
    -> -- call pr_stat_agent ('2008-07-17', '2008-07-18')
    ->
    -> create procedure pr_stat_agent
    -> (
    ->    pi_date_from  date
    ->   ,pi_date_to    date
    -> )
    -> begin
    ->    -- check input
    ->    if (pi_date_from is null) then
    ->       set pi_date_from = current_date();
    ->    end if;
    ->
    ->    if (pi_date_to is null) then
    ->       set pi_date_to = pi_date_from;
    ->    end if;
    ->
    ->    set pi_date_to = date_add(pi_date_from, interval 1 day);
    ->
    ->    -- stat
    ->    select agent, count(*) as cnt
    ->      from apache_log
    ->     where request_time >= pi_date_from
    ->       and request_time <  pi_date_to
    ->     group by agent
    ->     order by cnt desc;
    -> end; //
    ->
    -> delimiter ; //   -- 改回暗许的 MySQL delimiter:“;”
    -> //
    -> //
    -> //
    -> ;
    -> ;
    ->

当成想不到了!最终终于发掘标题了,在 MySQL 命令行下运维 “delimiter //; ” 则 MySQL 的 delimiter 实际上是 “//;”,并不是大家所预期的 “//”。其实若是运营指令 “delimiter //” 就 OK 了。

mysql> delimiter //     -- 末尾不要符号 “;”
mysql>
mysql> drop procedure if exists pr_stat_agent //
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> -- call pr_stat_agent ('2008-07-17', '2008-07-18')
mysql>
mysql> create procedure pr_stat_agent
    -> (
    ->    pi_date_from  date
    ->   ,pi_date_to    date
    -> )
    -> begin
    ->    -- check input
    ->    if (pi_date_from is null) then
    ->       set pi_date_from = current_date();
    ->    end if;
    ->
    ->    if (pi_美高梅游戏官网网站,date_to is null) then
    ->       set pi_date_to = pi_date_from;
    ->    end if;
    ->
    ->    set pi_date_to = date_add(pi_date_from, interval 1 day);
    ->
    ->    -- stat
    ->    select agent, count(*) as cnt
    ->      from apache_log
    ->     where request_time >= pi_date_from
    ->       and request_time <  pi_date_to
    ->     group by agent
    ->     order by cnt desc;
    -> end; //
Query OK, 0 rows affected (0.00 sec)

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

顺带风流倜傥提的是,大家得以在 MySQL 数据库中试行在文件中的 SQL 代码。举例,作者把地点存款和储蓄进程的代码放在文件 d:pr_stat_agent.sql 中。能够运作上面包车型客车代码建构存款和储蓄进程。

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

Query OK, 0 rows affected (0.00 sec)

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

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

Query OK, 0 rows affected (0.00 sec)

提起底,可以见到 MySQL 的客商端工具在有些地点是独立自主,各自有各自的生机勃勃套。

: DELIMITER $$ DROP TRIGGER IF EXISTS `updateegopriceondelete`$$ CREATE TRIGGER `updateegopriceondelete` AFTER DELETE ON `customerinfo` FOR EACH ROW BEGIN DEL...

本文由美高梅网址发布于美高梅游戏官网网站,转载请注明出处:delimiter的作用是什么

上一篇:MySQL与SQL的触发器的不同写法 下一篇:没有了
猜你喜欢
热门排行
精彩图文