欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何分析MySQL基礎(chǔ)中的觸發(fā)器和事件

本篇文章給大家分享的是有關(guān)如何分析MySQL基礎(chǔ)中的觸發(fā)器和事件,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了岳西免費建站歡迎大家使用!

觸發(fā)器

我們使用MySQL的過程中可能會有下邊這些需求:

  • 在向t1表插入或更新數(shù)據(jù)之前對自動對數(shù)據(jù)進行校驗,要求m1列的值必須在1~10之間,校驗規(guī)則如下:

    • 如果插入的記錄的m1列的值小于1,則按1插入。

    • 如果m1列的值大于10,則按10插入。

  • 在向t1表中插入記錄之后自動把這條記錄插入到t2表。

也就是我們在對表中的記錄做增、刪、改操作前和后都可能需要讓MySQL服務(wù)器自動執(zhí)行一些額外的語句,這個就是所謂的觸發(fā)器的應(yīng)用場景。

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

我們看一下定義觸發(fā)器的語句:

CREATE TRIGGER 觸發(fā)器名
{BEFORE|AFTER}
{INSERT|DELETE|UPDATE}
ON 表名
FOR EACH ROW
BEGIN
    觸發(fā)器內(nèi)容
END

小貼士:

由大括號`{}`包裹并且內(nèi)部用豎線`|`分隔的語句表示必須在給定的選項中選取一個值,比如`{BEFORE|AFTER}`表示必須在`BEFORE`、`AFTER`這兩個之間選取一個。

其中{BEFORE|AFTER}表示觸發(fā)器內(nèi)容執(zhí)行的時機,它們的含義如下:

名稱描述
BEFORE表示在具體的語句執(zhí)行之前就開始執(zhí)行觸發(fā)器的內(nèi)容
AFTER表示在具體的語句執(zhí)行之后才開始執(zhí)行觸發(fā)器的內(nèi)容

{INSERT|DELETE|UPDATE}表示具體的語句,MySQL中目前只支持對INSERT、DELETE、UPDATE這三種類型的語句設(shè)置觸發(fā)器。

FOR EACH ROW BEGIN ... END表示對具體語句影響的每一條記錄都執(zhí)行我們自定義的觸發(fā)器內(nèi)容:

  • 對于INSERT語句來說,FOR EACH ROW影響的記錄就是我們準(zhǔn)備插入的那些新記錄。

  • 對于DELETE語句和UPDATE語句來說,FOR EACH ROW影響的記錄就是符合WHERE條件的那些記錄(如果語句中沒有WHERE條件,那就是代表全部的記錄)。

小貼士: 如果觸發(fā)器內(nèi)容只包含一條語句,那也可以省略BEGN、END這兩個詞兒。

因為MySQL服務(wù)器會對某條語句影響的所有記錄依次調(diào)用我們自定義的觸發(fā)器內(nèi)容,所以針對每一條受影響的記錄,我們需要一種訪問該記錄中的內(nèi)容的方式,MySQL提供了NEWOLD兩個單詞來分別代表新記錄和舊記錄,它們在不同語句中的含義不同:

  • 對于INSERT語句設(shè)置的觸發(fā)器來說,NEW代表準(zhǔn)備插入的記錄,OLD無效。

  • 對于DELETE語句設(shè)置的觸發(fā)器來說,OLD代表刪除前的記錄,NEW無效。

  • 對于UPDATE語句設(shè)置的觸發(fā)器來說,NEW代表修改后的記錄,OLD代表修改前的記錄。

現(xiàn)在我們可以正式定義一個觸發(fā)器了:

mysql> delimiter $
mysql> CREATE TRIGGER bi_t1
    -> BEFORE INSERT ON t1
    -> FOR EACH ROW
    -> BEGIN
    ->     IF NEW.m1 < 1 THEN
    ->         SET NEW.m1 = 1;
    ->     ELSEIF NEW.m1 > 10 THEN
    ->         SET NEW.m1 = 10;
    ->     END IF;
    -> END $
Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;
mysql>

我們對t1表定義了一個名叫bi_t1觸發(fā)器,它的意思就是在對t1表插入新記錄之前,對準(zhǔn)備插入的每一條記錄都會執(zhí)行BEGIN ... END之間的語句,NEW.列名表示當(dāng)前待插入記錄指定列的值。現(xiàn)在t1表中一共有4條記錄:

mysql> SELECT * FROM t1;
+------+------+
| m1   | n1   |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
+------+------+
4 rows in set (0.00 sec)

mysql>

我們現(xiàn)在執(zhí)行一下插入語句并再次查看一下t1表的內(nèi)容:

mysql> INSERT INTO t1(m1, n1) VALUES(5, 'e'), (100, 'z');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t1;
+------+------+
| m1   | n1   |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | e    |
|   10 | z    |
+------+------+
6 rows in set (0.00 sec)

mysql>

這個INSERT語句影響的記錄有兩條,分別是(5, 'e')(100, 'z'),這兩條記錄將分別執(zhí)行我們自定義的觸發(fā)器內(nèi)容。很顯然(5, 'e')被成功的插入到了t1表中,而(100, 'z')插入到表中后卻變成了(10, 'z'),這個就說明我們的bi_t1觸發(fā)器生效了!

小貼士: 我們上邊定義的觸發(fā)器名`bi_t1`的`bi`是`before insert`的首字母縮寫,`t1`是表名。雖然對于觸發(fā)器的命名并沒有什么特殊的要求,但是習(xí)慣上還是建議大家把它定義我上邊例子中的形式,也就是`bi_表名`、`bd_表名`、`bu_表名`、`ai_表名`、`ad_表名`、`au_表名`的形式。

上邊只是舉了一個對INSERT語句設(shè)置BEFORE觸發(fā)器的例子,對DELETEUPDATE操作設(shè)置BEFORE或者AFTER觸發(fā)器的過程是類似的,就不贅述了。

查看和刪除觸發(fā)器

查看當(dāng)前數(shù)據(jù)庫中定義的所有觸發(fā)器的語句:

SHOW TRIGGERS;

查看某個具體的觸發(fā)器的定義:

SHOW CREATE TRIGGER 觸發(fā)器名;

刪除觸發(fā)器:

DROP TRIGGER 觸發(fā)器名;

這幾個命令太簡單了,就不舉例子了啊~

觸發(fā)器使用注意事項

  • 觸發(fā)器內(nèi)容中不能有輸出結(jié)果集的語句。

    比方說:

    mysql> delimiter $
    mysql> CREATE TRIGGER ai_t1
        -> AFTER INSERT ON t1
        -> FOR EACH ROW
        -> BEGIN
        ->     SELECT NEW.m1, NEW.n1;
        -> END $
    ERROR 1415 (0A000): Not allowed to return a result set from a trigger
    mysql>

    顯示的ERROR的意思就是不允許在觸發(fā)器內(nèi)容中返回結(jié)果集!

  • 觸發(fā)器內(nèi)容中NEW代表記錄的列的值可以被更改,OLD代表記錄的列的值無法更改。

    NEW代表新插入或著即將修改后的記錄,修改它的列的值將影響INSERT和UPDATE語句執(zhí)行后的結(jié)果,而OLD代表修改或刪除之前的值,我們無法修改它。比方說如果我們非要這么寫那就會報錯的:

    mysql> delimiter $
    mysql> CREATE TRIGGER bu_t1
        -> BEFORE UPDATE ON t1
        -> FOR EACH ROW
        -> BEGIN
        ->     SET OLD.m1 = 1;
        -> END $
    ERROR 1362 (HY000): Updating of OLD row is not allowed in trigger
    mysql>

    可以看到提示的錯誤中顯示在觸發(fā)器中OLD代表的記錄是不可被更改的。

  • 在BEFORE觸發(fā)器中,我們可以使用SET NEW.列名 = 某個值的形式來更改待插入記錄或者待更新記錄的某個列的值,但是這種操作不能在AFTER觸發(fā)器中使用,因為在執(zhí)行AFTER觸發(fā)器的內(nèi)容時記錄已經(jīng)被插入完成或者更新完成了。

    比方說如果我們非要這么寫那就會報錯的:

    mysql> delimiter $
    mysql>     CREATE TRIGGER ai_t1
        ->     AFTER INSERT ON t1
        ->     FOR EACH ROW
        ->     BEGIN
        ->         SET NEW.m1 = 1;
        ->     END $
    ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger
    mysql>

    可以看到提示的錯誤中顯示在AFTER觸發(fā)器中是不允許更改NEW代表的記錄的。

  • 如果我們的BEFORE觸發(fā)器內(nèi)容執(zhí)行過程中遇到了錯誤,那這個觸發(fā)器對應(yīng)的具體語句將無法執(zhí)行;如果具體的操作語句執(zhí)行過程中遇到了錯誤,那與它對應(yīng)的AFTER觸發(fā)器的內(nèi)容將無法執(zhí)行。

    小貼士: 對于支持事務(wù)的表,不論是執(zhí)行觸發(fā)器內(nèi)容還是具體操作語句過程中出現(xiàn)了錯誤,會把這個過程中所有的語句都回滾。當(dāng)然,作為小白的我們并不知道啥是個事務(wù),啥是個回滾,這些進階內(nèi)容都在《MySQL是怎樣運行的:從根兒上理解MySQL》中呢~

事件

有時候我們想讓MySQL服務(wù)器在某個時間點或者每隔一段時間自動地執(zhí)行一些語句,這時候就需要去創(chuàng)建一個事件。

創(chuàng)建事件

創(chuàng)建事件的語法如下:

CREATE EVENT 事件名
ON SCHEDULE
{
    AT 某個確定的時間點| 
    EVERY 期望的時間間隔 [STARTS datetime][END datetime]
}
DO
BEGIN
    具體的語句
END

事件支持兩種類型的自動執(zhí)行方式:

  1. 在某個確定的時間點執(zhí)行。

    比方說:

    CREATE EVENT insert_t1_event
    ON SCHEDULE
    AT '2019-09-04 15:48:54'
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END

    我們在這個事件中指定了執(zhí)行時間是'2019-09-04 15:48:54',除了直接填某個時間常量,我們也可以填寫一些表達(dá)式:

    CREATE EVENT insert_t1
    ON SCHEDULE
    AT DATE_ADD(NOW(), INTERVAL 2 DAY)
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END

    其中的DATE_ADD(NOW(), INTERVAL 2 DAY)表示該事件將在當(dāng)前時間的兩天后執(zhí)行。

  2. 每隔一段時間執(zhí)行一次。

    比方說:

    CREATE EVENT insert_t1
    ON SCHEDULE
    EVERY 1 HOUR
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END

    其中的EVERY 1 HOUR表示該事件將每隔1個小時執(zhí)行一次。默認(rèn)情況下,采用這種每隔一段時間執(zhí)行一次的方式將從創(chuàng)建事件的事件開始,無限制的執(zhí)行下去。我們也可以指定該事件開始執(zhí)行時間和截止時間:

    CREATE EVENT insert_t1
    ON SCHEDULE
    EVERY 1 HOUR STARTS '2019-09-04 15:48:54' ENDS '2019-09-16 15:48:54'
    DO
    BEGIN
        INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END

    如上所示,該事件將從'2019-09-04 15:48:54'開始直到'2019-09-16 15:48:54'為止,中間每隔1個小時執(zhí)行一次。

    小貼士: 表示事件間隔的單位除了HOUR,還可以用YEAR、QUARTER、MONTH、DAY、HOUR、 MINUTE、WEEK、SECOND、YEAR_MONTH、DAY_HOUR、DAY_MINUTE、DAY_SECOND、HOUR_MINUTE、HOUR_SECOND、MINUTE_SECOND這些單位,根據(jù)具體需求選用我們需要的時間間隔單位。

在創(chuàng)建好事件之后我們就不用管了,到了指定時間,MySQL服務(wù)器會幫我們自動執(zhí)行的。

查看和刪除事件

查看當(dāng)前數(shù)據(jù)庫中定義的所有事件的語句:

SHOW EVENTS;

查看某個具體的事件的定義:

SHOW CREATE EVENT 事件名;

刪除事件:

DROP EVENT 事件名;

這幾個命令太簡單了,就不舉例子了啊~

事件使用注意事項

默認(rèn)情況下,MySQL服務(wù)器并不會幫助我們執(zhí)行事件,除非我們使用下邊的語句手動開啟該功能:

mysql> SET GLOBAL event_scheduler = ON;
Query OK, 0 rows affected (0.00 sec)

mysql>

小貼士: event_scheduler其實是一個系統(tǒng)變量,它的值也可以在MySQL服務(wù)器啟動的時候通過啟動參數(shù)或者通過配置文件來設(shè)置event_scheduler的值。這些所謂的系統(tǒng)變量、啟動參數(shù)、配置文件的各種東東并不是我們小白現(xiàn)在需要掌握的,大家忽略它們就好了~

以上就是如何分析MySQL基礎(chǔ)中的觸發(fā)器和事件,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞標(biāo)題:如何分析MySQL基礎(chǔ)中的觸發(fā)器和事件
文章網(wǎng)址:http://aaarwkj.com/article28/gjdjcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、App開發(fā)電子商務(wù)、做網(wǎng)站、服務(wù)器托管企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
九九热最新视频免费看| 日韩精品在线另类亚洲| 亚洲人成网站18禁止人| 国产av一级二级三级最新精品| 色一区欧美一区亚洲一区| 97碰碰视频在线观看| 99人妻一区二区三区在线| 天天干夜夜操天天射| 国产姐弟操大率悠荡笕| 国产精品麻豆色哟哟av| 国产91精品系列在线观看| 精品国产一区二区av麻豆| 国产三级三级三级三级| 国产精品兄妹在线观看91| 亚洲精品露脸自拍高清在线观看 | 免费黄色福利网址大片| 在线亚洲av不卡一区二区三区| 国产精品久久久久精品三级中文国 | 亚洲视频一直看一直爽| 国产精品一区二区熟女| 日本免费的高清一区二区| 午夜亚洲欧美日韩在线| 免费97久久人妻一区精品| 日本91免费在线观看| 亚洲高清成人在线观看| 国产在线高清精品二区| 少妇高潮特黄在线观看| 日本熟妇色在线视频不卡| 亚洲精品一区二区激情| 成年自拍视频在线观看| 日本午夜一区二区在线观看| 日韩中字伦理熟妇人妻| 日本不卡免费一区二区视频| 中文字幕加勒比东京热| 成人爱爱免费观看视频| 日韩av中文一区二区| 亚洲乱码中文字幕人妻| 国产日韩欧美一区二区三区四区| 国语自产拍在线观看不卡| 欧美日韩国产另类在线视频| 国内精品久久久久久2021|