數據庫 函數 存儲過程 觸發器 事件 視圖

MYSQL數據庫重點:自定義函數、存儲過程、觸發器、事件、視圖

一、自定義函數

  mysql自定義函數就是實現程序員需要sql邏輯處理,參數是IN參數,含有RETURNS字句用來指定函數的返回類型,而且函數體必須包含一個RETURN value語句。

語法:

創建:CREATE FUNCTION 函數名稱(參數列表)

  RETURNS 返回值類型

  函數體

修改: ALTER FUNCTION 函數名稱 [characteristic ...]

刪除:DROP FUNCTION [IF EXISTS] 函數名稱

調用:SELECT 函數名稱(參數列表)

 

二、存儲過程

 

  一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,比一個個執行sql語句效率高,用戶通過指定存儲過程的名字並給出參數來執行它。參數可以爲IN, OUT, 或INOUT

語法:

創建:CREATE PROCEDURE 過程名 (參數列表) [characteristic ...] 

  函數體

修改: ALTER PROCEDURE  過程名 [characteristic ...]

刪除:DROP PROCEDURE [IF EXISTS] 過程名

調用:CALL 過程名(參數列表)

 

注意:存儲過程和自定義函數的區別:
1.存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作,也可以創建爲數據庫啓動時自動運行的存儲過程。

自定義函數,用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。

2.對於sql server: 存儲過程,可以使用非確定函數。自定義函數,不允許在用戶定義函數主體中內置非確定函數。


3.存儲過程,可返回記錄集。

自定義函數,可以返回表變量。

4.存儲過程,其返回值不能被直接引用。

自定義函數,其返回值可以被直接引用。

5.存儲過程,用 CALL 語句執行。

自定義函數,在查詢語句中調用。

 

3、觸發器

  與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。

語法:

創建:

CREATE TRIGGER <觸發器名稱>  --觸發器必須有名字,最多64個字符,可能後面會附有分隔符.它和MySQL中其他對象的命名方式基本相象.
{ BEFORE | AFTER }  --觸發器有執行的時間設置:可以設置爲事件發生前或後。
{ INSERT | UPDATE | DELETE }  --同樣也能設定觸發的事件:它們可以在執行insert、update或delete的過程中觸發。
ON <表名稱>  --觸發器是屬於某一個表的:當在這個表上執行插入、 更新或刪除操作的時候就導致觸發器的激活. 我們不能給同一張表的同一個事件安排兩個觸發器。
FOR EACH ROW  --觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行執行一次動作,而不是對整個表執行一次。
<觸發器SQL語句>  --觸發器包含所要觸發的SQL語句:這裏的語句可以是任何合法的語句, 包括複合語句,但是這裏的語句受的限制和函數的一樣。
--創建觸發器(CREATE TRIGGER),需要SUPER權限。

eg:

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END

刪除:DROP TRIGGER 方案名稱.觸發器名稱

4、事件

  事件調度器是MySQL5.1後新增的功能,可以將數據庫按自定義的時間週期觸發某種操作,可以理解爲時間觸發器,類似於linux系統下面的任務調度器crontab,或者類似與window下面的計劃任務。值得一提的是MySQL的事件調度器可以精確到每秒鐘執行一個任務,而操作系統的計劃任務(如:Linux下的CRON或Windows下的任務計劃)只能精確到每分鐘執行一次。

語法:

創建:

CREATE

    [DEFINER = { user | CURRENT_USER }]   --定義事件執行的時候檢查權限的用戶。

    EVENT

    [IF NOT EXISTS]

    event_name

    ON SCHEDULE schedule              --定義執行的時間和時間間隔。

    [ON COMPLETION [NOT] PRESERVE]     --定義事件是一次執行還是永久執行,默認爲一次執行,即NOT PRESERVE。

    [ENABLE | DISABLE | DISABLE ON SLAVE]   --定義事件創建以後是開啓還是關閉,以及在從上關閉。如果是從服務器自動同步主上的創建事件的語句的話,會自動加上DISABLE ON SLAVE

    [COMMENT 'comment']                 -- 註釋

    DO event_body;

 

schedule:

    AT timestamp [+ INTERVAL interval] ...

     | EVERY interval

    [STARTS timestamp [+ INTERVAL interval]...]

    [ENDS timestamp [+ INTERVAL interval] ...]

interval:

  quantity {YEAR | QUARTER | MONTH | DAY | HOUR| MINUTE |

              WEEK | SECOND | YEAR_MONTH |DAY_HOUR |

DAY_MINUTE |DAY_SECOND| HOUR_MINUTE |

HOUR_SECOND| MINUTE_SECOND}

刪除:

DROP EVENT [IF EXISTS] event_name

 

修改:

ALTER

    [DEFINER = { user | CURRENT_USER }]

    EVENT event_name

    [ON SCHEDULE schedule]

    [ON COMPLETION [NOT] PRESERVE]

    [RENAME TO new_event_name]

    [ENABLE | DISABLE | DISABLE ON SLAVE]

    [COMMENT 'comment']

    [DO event_body]

查看事件是否開啓,使用如下命令查看:

SHOW VARIABLES LIKE 'event_scheduler';

SELECT @@event_scheduler;

SHOW PROCESSLIST;

如果看到event_scheduler爲on或者PROCESSLIST中顯示有event_scheduler的信息說明就已經開啓了事件。如果顯示爲off或者在PROCESSLIST中查看不到event_scheduler的信息,那麼就說明事件沒有開啓,我們需要開啓它。

開啓事件:

開啓mysql的事件,通過如下三種方式開啓:

Ø  通過動態參數修改

SET GLOBAL event_scheduler = ON;    更改完這個參數就立刻生效了

注意:還是要在my.ini中添加event_scheduler=ON。因爲如果沒有添加的話,mysql重啓事件又會回到原來的狀態了。

Ø  更改配置文件然後重啓

在my.ini中的[mysqld]部分添加如下內容,然後重啓mysql。

event_scheduler=ON

Ø  通過制定事件參數啓動

mysqld ... --event_scheduler=ON

 

5、視圖

   視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。視圖是存儲在數據庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金錶,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使複雜的查詢易於理解和使用。這個視圖就像一個“窗口”,從中只能看到你想看的數據列。這意味着你可以在這個視圖上使用SELECT *,而你看到的將是你在視圖定義裏給出的那些數據列:

語法:

創建:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(列名列表)]
AS 查詢語句
[WITH [CASCADED | LOCAL] CHECK OPTION]

修改:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

刪除:

DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章