最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySql delimiter的作用是什么

 更新時間:2010年09月13日 00:03:15   作者:  
其實就是告訴mysql解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了。默認情況下,delimiter是分號;。在命令行客戶端中,如果有一行命令以分號結(jié)束,那么回車后,mysql將會執(zhí)行該命令。
MYSQL導(dǎo)出一個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 ;

其中DELIMITER 定好結(jié)束符為"$$", 然后最后又定義為";", MYSQL的默認結(jié)束符為";".



詳細解釋:


其實就是告訴mysql解釋器,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了。
默認情況下,delimiter是分號;。在命令行客戶端中,如果有一行命令以分號結(jié)束,
那么回車后,mysql將會執(zhí)行該命令。如輸入下面的語句
mysql> select * from test_table;
然后回車,那么MySQL將立即執(zhí)行該語句。

但有時候,不希望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;
默認情況下,不可能等到用戶把這些語句全部輸入完之后,再執(zhí)行整段語句。
因為mysql一遇到分號,它就要自動執(zhí)行。
即,在語句RETURN '';時,mysql解釋器就要執(zhí)行了。
這種情況下,就需要事先把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;//
這樣只有當//出現(xiàn)之后,mysql解釋器才會執(zhí)行這段語句


例子:

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 下運行通過。

編寫了個統(tǒng)計網(wǎng)站訪問情況(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 2005 for MySQL 這個 MySQL 圖形客戶端下可以順利運行。但是在 SQLyog MySQL GUI v5.02 這個客戶端就會出錯。最后找到原因是沒有設(shè)置好 delimiter 的問題。默認情況下,delimiter “;” 用于向 MySQL 提交查詢語句。在存儲過程中每個 SQL 語句的結(jié)尾都有個 “;”,如果這時候,每逢 “;” 就向 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 符號是可以自由設(shè)定的,你可以用 “/” 或者“$$” 等。但是 MySQL 存儲過程中比較常見的用法是 “//” 和 “$$”。上面的這段在 SQLyog 中的代碼搬到 MySQL 命令客戶端(MySQL Command Line Client)卻不能執(zhí)行。

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:“;”
    -> //
    -> //
    -> //
    -> ;
    -> ;
    ->

真是奇怪了!最后終于發(fā)現(xiàn)問題了,在 MySQL 命令行下運行 “delimiter //; ” 則 MySQL 的 delimiter 實際上是 “//;”,而不是我們所預(yù)想的 “//”。其實只要運行指令 “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 數(shù)據(jù)庫中執(zhí)行在文件中的 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 的客戶端工具在有些地方是各自為政,各有各的一套。

相關(guān)文章

  • MySQL表自增id溢出的故障復(fù)盤解決

    MySQL表自增id溢出的故障復(fù)盤解決

    這篇文章主要介紹了MySQL表自增id溢出的故障復(fù)盤解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-04-04
  • MySQL核心參數(shù)優(yōu)化文件my.ini實現(xiàn)

    MySQL核心參數(shù)優(yōu)化文件my.ini實現(xiàn)

    本文主要介紹了MySQL核心參數(shù)優(yōu)化文件my.ini實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-01-01
  • MySQL中的主鍵以及設(shè)置其自增的用法教程

    MySQL中的主鍵以及設(shè)置其自增的用法教程

    這篇文章主要介紹了MySQL中的主鍵以及設(shè)置其自增的用法教程,是MySQL入門學(xué)習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • My Sql 1067錯誤與編碼問題的解決方案

    My Sql 1067錯誤與編碼問題的解決方案

    My Sql 大部分都是用綠色版(解壓版) 然后注冊服務(wù)簡單方便,但是配置文件也很讓人糾結(jié),下面小編給大家?guī)砹薓y Sql 1067錯誤與編碼問題的解決方案,感興趣的朋友參考下吧
    2016-11-11
  • MySQL中使用binlog時格式該如何選擇

    MySQL中使用binlog時格式該如何選擇

    這篇文章主要給大家介紹了關(guān)于MySQL中使用binlog時格式該如何選擇的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-11-11
  • 基于mysql事務(wù)、視圖、存儲過程、觸發(fā)器的應(yīng)用分析

    基于mysql事務(wù)、視圖、存儲過程、觸發(fā)器的應(yīng)用分析

    本篇文章是對mysql事務(wù)、視圖、存儲過程、觸發(fā)器的應(yīng)用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • MySQL去除字段里數(shù)字的示例代碼

    MySQL去除字段里數(shù)字的示例代碼

    本文主要介紹了MySQL去除字段里數(shù)字的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-06-06
  • mysql優(yōu)化配置參數(shù)

    mysql優(yōu)化配置參數(shù)

    mysql安裝好需要優(yōu)化配置一下,打開c:\windows\my.ini文件
    2011-03-03
  • MySQL實現(xiàn)顯示百分比顯示和前百分之幾的方法

    MySQL實現(xiàn)顯示百分比顯示和前百分之幾的方法

    這篇文章主要介紹了MySQL中如何顯示百分比和顯示前百分之幾的,文中的示例代碼講解詳細,對我們學(xué)習MySQL有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • mysql 備份與遷移 數(shù)據(jù)同步方法

    mysql 備份與遷移 數(shù)據(jù)同步方法

    以前要做mysql的備份,我往往都是利用 EMS SQL Manager 實現(xiàn)導(dǎo)出 sql腳本文件,或者導(dǎo)出dbf 文件。而要把本地數(shù)據(jù)庫遷移到遠程直接把腳本在服務(wù)端執(zhí)行就OK。
    2009-10-10

最新評論

盐津县| 青田县| 金沙县| 泗水县| 治多县| 翼城县| 郎溪县| 昌都县| 香河县| 杭锦旗| 浑源县| 伊宁市| 财经| 平原县| 宁陵县| 田阳县| 简阳市| 江永县| 蒙城县| 秦皇岛市| 四平市| 新巴尔虎右旗| 二手房| 工布江达县| 甘泉县| 枣强县| 甘肃省| 石城县| 安溪县| 政和县| 阿巴嘎旗| 镇宁| 桑日县| 宜章县| 安远县| 贡山| 东兰县| 武邑县| 利川市| 浑源县| 偃师市|