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

詳解MySQL中存儲函數創(chuàng)建與觸發(fā)器設置

 更新時間:2022年08月23日 08:56:57   作者:遇安.112  
這篇文章主要為大家詳細介紹了MySQL中存儲函數的創(chuàng)建與觸發(fā)器的設置,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下

存儲函數也是過程式對象之一,與存儲過程相似。他們都是由SQL和過程式語句組成的代碼片段,并且可以從應用程序和SQL中調用。然而,他們也有一些區(qū)別:

1、存儲函數沒有輸出參數,因為存儲函數本身就是輸出參數。

2、不能用CALL語句來調用存儲函數。

3、存儲函數必須包含一條RETURN語句,而這條特殊的SQL語句不允許包含于存儲過程中

1、創(chuàng)建存儲函數

使用CREATE FUNCTION語句創(chuàng)建存儲函數

語法格式: 

CREATE FUNCTION 存儲函數名 ([參數[,...]])
RETURNS 類型
函數體

注:存儲函數不能擁有與存儲過程相同的名字。存儲函數體中必須包含一個RETURN值語句,值為存儲函數的返回值。

例:創(chuàng)建一個存儲函數,其返回Book表中圖書數目作為結果 

DELIMITER $$
CREATE FUNCTION num_book()
RETURNS INTEGER
BEGIN
RETURN(SELECT COUNT(*)FROM Book);
END$$
DELIMITER ;

RETURN子句中包含SELECT語句時,SELECT語句的返回結果只能是一行且只能有一列值。雖然該存儲函數沒有參數,使用時也要用(),如num_book()。

例:創(chuàng)建一個存儲函數來刪除Sell表中有但Book表中不存在的記錄 

DELIMITER $$
CREATE FUNCTION del_sell(book_bh CHAR(20))
RETURNS BOOLEAN
BEGIN
DECLARE bh CHAR(20);
SELECT 圖書編號 INTO bh FROM Book WHERE 圖書編號=book_bh;
IF bh IS NULL THEN
DELETE FROM Sell WHERE 圖書編號=book_bh;
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END$$
DELIMITER ;

該存儲函數給定圖書編號作為輸入參數,先按給定的圖書編號到Book表查找看有沒有該圖書編號的書,如果沒有,返回false,如果有,返回true。同時還要到Sell表中刪除該圖書編號的書。要查看數據庫中有哪些存儲函數,可以使用SHOW FUNCTION STATUS命令。

2、調用存儲函數

存儲函數創(chuàng)建完后,調用存儲函數的方法和使用系統提供的內置函數相同,都是使用SELECT關鍵字。

語法格式:

SELECT 存儲函數名([參數[,...]])

例:創(chuàng)建一個存儲函數publish_book,通過調用存儲函數author_book獲得圖書的作者,并判斷該作者是否姓“張”,是則返回出版時間,不是則返回“不合要求”。 

DELIMITER $$
CREATE FUNCTION publish_book(b_name CHAR(20))
RETURNS CHAR(20)
BEGIN
DECLARE name CHAR(20);
SELECT author_book(b_name)INTO name;
IF name like'張%' THEN
RETURN(SELECT 出版時間 FROM Book WHERE 書名=b_name);
ELSE
RETURN'不合要求';
END IF;
END$$
DELIMITER ;

調用存儲函數publish_book查看結果:

SELECT publish_book('計算機網絡技術');

刪除存儲函數的方法和刪除存儲過程的方法基本一樣,使用DROP FUNCTION語句

語法格式:

DROP FUNCTION [IF EXISTS]存儲函數名

注:IF EXISTS子句是MySQL的擴展,如果函數不存在,它防止發(fā)生錯誤

例:刪除存儲函數a 

DROP FUNCTION IF EXISTS a;

3、創(chuàng)建觸發(fā)器

使用CREATE TRIGGER語句創(chuàng)建觸發(fā)器

語法格式:

CREATE TRIGGER 觸發(fā)器名 觸發(fā)時間 觸發(fā)事件
ON 表名 FOR EACH ROW 觸發(fā)器動作

觸發(fā)時間有兩個選項:BEFORE和AFTER,以表示觸發(fā)器是在激活它的語句之前或之后觸發(fā)。如果想要在激活觸發(fā)器的語句執(zhí)行之后執(zhí)行通常使用AFTER選項。如果想要驗證新數據是否滿足使用的限制,則使用BEFORE選項。

觸發(fā)器不能返回任何結果到客戶端,為了阻止從觸發(fā)器返回結果,不要在觸發(fā)器定義中包含SELECT語句。同樣,也不能調用將數據返回客戶端的存儲過程。

例: 創(chuàng)建一個表table1,其中只有一列a,在表上創(chuàng)建一個觸發(fā)器,每次插入操作時,將用戶變量str的值設為TRIGGER IS WORKING。

CREATE TABLE table1(a INTEGER);
CREATE TRIGGER table1_insert AFTER INSERT
ON table1 FOR EACH ROW
SET@str='TRIGGER IS WORKING';

要查看數據庫中有哪些觸發(fā)器可以使用SHOW TRIGGERS命令。

在MySQL觸發(fā)器中的SQL語句可以關聯表中的任意列。但不能直接使用列的名稱去標志,那會使系統混淆,因為激活觸發(fā)器的語句可能已經修改、刪除或添加了新的列名,而列的舊名同時存在。因此必須用這樣的語法來標志:NEW.column_name或者OLD.column_name。NEW.column_name用來引用新行的一列,OLD.column_name用來引用更新或刪除它之前的已有行的一列。

對于INSERT語句,只有NEW是合法的,對于DELETE語句,只有OLD才合法。而UPDATE語句可以與NEW和OLD同時使用。

例:創(chuàng)建一個觸發(fā)器,當刪除表Book中某圖書的信息時,同時將Sell表中與該圖書有關的數據全部刪除。 

DELIMITER $$
CREATE TRIGGER book_del AFTER DELETE
ON Book FOR EACH ROW
BEGIN
DELETE FROM Sell WHERE 圖書編號=OLD.圖書編號;
END$$
DELIMITER ;

當觸發(fā)器要觸發(fā)的是表自身的更新操作時,只能使用BEFORE觸發(fā)器,而AFTER觸發(fā)器將不被允許。

4、在觸發(fā)器中調用存儲過程 

例:假設Bookstore數據庫中有一個與Members表結構完全一樣的表member_b,創(chuàng)建一個觸發(fā)器,在Members表中添加數據的時候,調用存儲過程,將member_b表中的數據與Members表同步。

1、定義存儲過程:創(chuàng)建一個與Members表結構完全一樣的表member_b 

DELIMITER $$
CREATE PROCEDURE data_copy()
BEGIN
REPLACE member_b SELECT * FROM Members;
END$$

2、創(chuàng)建觸發(fā)器:調用存儲過程data_copy()

DELIMITER $$
CREATE TRIGGER members_ins AFTER INSERT
ON Members FOR EACH ROW
CALL data_copy();
DELIMITER ;

5、刪除觸發(fā)器

語法格式:

DROP TRIGGER 觸發(fā)器名

例:刪除觸發(fā)器members_ins

DROP TRIGGER members_ins;

以上就是詳解MySQL中存儲函數創(chuàng)建與觸發(fā)器設置的詳細內容,更多關于MySQL存儲函數 觸發(fā)器的資料請關注腳本之家其它相關文章!

相關文章

  • mysql 5.7.9 免安裝版配置方法圖文教程

    mysql 5.7.9 免安裝版配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.9 免安裝版配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-08-08
  • mysql 8.0.18 安裝配置方法圖文教程(linux)

    mysql 8.0.18 安裝配置方法圖文教程(linux)

    這篇文章主要介紹了linux下mysql 8.0.18 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • MySQL嵌套查詢實例詳解

    MySQL嵌套查詢實例詳解

    這篇文章主要介紹了MySQL嵌套查詢的使用技巧,結合實例形式較為詳細的分析了MySQL嵌套查詢參數設置、使用方法與注意事項,需要的朋友可以參考下
    2015-12-12
  • 詳解mysql不等于null和等于null的寫法

    詳解mysql不等于null和等于null的寫法

    這篇文章主要介紹了詳解mysql不等于null和等于null的寫法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • MySQL中常用的字段截取和字符串截取方法

    MySQL中常用的字段截取和字符串截取方法

    在 MySQL 數據庫中,有時我們需要截取字段或字符串的一部分進行查詢、展示或處理,本文將介紹 MySQL 中常用的字段截取和字符串截取方法,幫助你靈活處理數據,需要的朋友可以參考下
    2024-01-01
  • MySql超詳細講解表的用法

    MySql超詳細講解表的用法

    這篇文章主要為大家詳細介紹了MySQL數據庫中表常用的一些操作方法,文中的示例代碼講解詳細, 對我們學習MySQL有一定幫助,需要的可以參考一下
    2022-09-09
  • MySQL數據庫表修復 MyISAM

    MySQL數據庫表修復 MyISAM

    這篇文章主要介紹了MySQL數據庫表修復 MyISAM ,需要的朋友可以參考下
    2014-06-06
  • MySQL的match函數在sp中使用BUG解決分析

    MySQL的match函數在sp中使用BUG解決分析

    這篇文章主要為大家介紹了MySQL的match函數在sp中使用BUG解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • MySQL實現replace函數的幾種實用場景

    MySQL實現replace函數的幾種實用場景

    這篇文章主要介紹了MySQL實現replace函數的幾種實用場景,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • mysql默認編碼為UTF-8 通過修改my.ini實現方法

    mysql默認編碼為UTF-8 通過修改my.ini實現方法

    這篇文章主要介紹了mysql默認編碼為UTF-8 通過修改my.ini實現方法的相關資料,為了防止出現亂碼,Latin1是不支持漢字的,所以要將其改為UTF-8或GBK,需要的朋友可以參考下
    2017-01-01

最新評論

伊通| 珲春市| 东明县| 留坝县| 蒲江县| 饶平县| 宝兴县| 浦北县| 连江县| 乐清市| 抚顺县| 凌云县| 锦州市| 南溪县| 吴江市| 城固县| 衢州市| 丰台区| 六枝特区| 花莲市| 贵州省| 隆化县| 尉氏县| 米林县| 远安县| 桃园市| 乐陵市| 察哈| 肇州县| 尼木县| 磐安县| 亚东县| 武城县| 渑池县| 文昌市| 日土县| 绥德县| 阿克陶县| 井冈山市| 永昌县| 会宁县|