日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql学习总结(10)——MySql触发器使用讲解

發(fā)布時間:2024/4/17 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql学习总结(10)——MySql触发器使用讲解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

? 觸發(fā)器(TRIGGER)是由事件來觸發(fā)某個操作。這些事件包括INSERT語句、UPDATE語句和DELETE語句。當數(shù)據(jù)庫系統(tǒng)執(zhí)行這些事件時,就會激活觸發(fā)器執(zhí)行相應(yīng)的操作。MySQL從5.0.2版本開始支持觸發(fā)器。在本文中將講解的內(nèi)容包括:
觸發(fā)器的含義和作用
如何創(chuàng)建觸發(fā)器
如何查看觸發(fā)器
如何刪除觸發(fā)器

?????? 觸發(fā)器是由INSERT、UPDATE和DELETE等事件來觸發(fā)某種特定操作。滿足觸發(fā)器的觸發(fā)條件時,數(shù)據(jù)庫系統(tǒng)就會執(zhí)行觸發(fā)器中定義的程序語句。這樣做可以保證某些操作之間的一致性。例如,當學(xué)生表中增加了一個學(xué)生的信息時,學(xué)生的總數(shù)就必須同時改變??梢栽谶@里創(chuàng)建一個觸發(fā)器,每次增加一個學(xué)生的記錄,就執(zhí)行一次計算學(xué)生總數(shù)的操作。這樣就可以保證每次增加學(xué)生的記錄后,學(xué)生總數(shù)是與記錄數(shù)是一致的。觸發(fā)器觸發(fā)的執(zhí)行語句可能只有一個,也可能有多個。本節(jié)將詳細講解創(chuàng)建觸發(fā)器的方法。

一、語法

創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器

MySQL中,創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器的基本形式如下:

[sql]? view plain copy
  • CREATE?TRIGGER?觸發(fā)器名?BEFORE?|?AFTER?觸發(fā)事件??
  • ON?表名?FOR?EACH?ROW?執(zhí)行語句??

  • 創(chuàng)建有多個執(zhí)行語句的觸發(fā)器

    MySQL中,觸發(fā)器觸發(fā)的執(zhí)行語句可能有多個。創(chuàng)建有多個執(zhí)行語句的觸發(fā)器的基本形式如下:

    [sql]? view plain copy
  • CREATE?TRIGGER?觸發(fā)器名?BEFORE?|?AFTER?觸發(fā)事件??
  • ON?表名?FOR?EACH?ROW??
  • BEGIN??
  • 執(zhí)行語句列表??
  • END??
  • 下面來具體說說語法

    1、命名規(guī)則

    [sql]? view plain copy
  • CREATE?TRIGGER?<觸發(fā)器名稱>?<--??
  • {?BEFORE?|?AFTER?}??
  • {?INSERT?|?UPDATE?|?DELETE?}??
  • ON?<表名稱>??
  • FOR?EACH?ROW??
  • BEGIN??
  • <觸發(fā)器SQL語句>??
  • END??
  • 觸發(fā)器必須有名字,最多64個字符,可能后面會附有分隔符.它和MySQL中其他對象的命名方式基本相象.
    2、觸發(fā)時間: BEFORE | AFTER?
    觸發(fā)器有執(zhí)行的時間設(shè)置:INSERT | UPDATE | DELETE?
    3、觸發(fā)事件前后
    同樣也能設(shè)定觸發(fā)的事件:它們可以在執(zhí)行insert、update或delete的過程中觸發(fā)。
    4.、表
    觸發(fā)器是屬于某一個表的:當在這個表上執(zhí)行插入、
    更新或刪除操作的時候就導(dǎo)致觸發(fā)器的激活.
    我們不能給同一張表的同一個事件安排兩個觸發(fā)器。
    5.、( 步長)觸發(fā)間隔
    觸發(fā)器的執(zhí)行間隔:FOR EACH ROW子句通知觸發(fā)器
    每隔一行執(zhí)行一次動作,而不是對整個表執(zhí)行一次。
    6、 語句
    觸發(fā)器包含所要觸發(fā)的SQL語句:這里的語句可以是任何合法的語句,
    包括復(fù)合語句,但是這里的語句受的限制和函數(shù)的一樣。
    Privileges權(quán)限
    你必須擁有相當大的權(quán)限才能創(chuàng)建觸發(fā)器(CREATE TRIGGER)。如果你已經(jīng)是Root用戶,那么就足夠了。這跟SQL的標準有所不同。


    二、關(guān)于舊的和新創(chuàng)建的列的標識

    ???? 在觸發(fā)器的SQL語句中,你可以關(guān)聯(lián)表中的任意列。但你不能僅使用列的名稱去標識,那會使系統(tǒng)混淆,因為那里可能會有列的新名(這可能正是你要修改的,你的動作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語法來標識: "NEW . column_name"或者"OLD . column_name".這樣在技術(shù)上處理(NEW | OLD . column_name)新和舊的列名屬于創(chuàng)建了過渡變量("transition variables")。?

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


    三、使用范例

    先創(chuàng)建兩個表、一個訂單表,一個訂單時間表

    [sql]? view plain copy
  • CREATE?TABLE?T_ORDER(??
  • ORDER_NUM?INT?PRIMARY?KEY,??
  • ORDER_NAME?CHAR(10)?NOT?NULL??
  • );??
  • CREATE?TABLE?T_ORDER_TIME(??
  • ORDER_NUM?INT?PRIMARY?KEY,??
  • ORDER_TIME?TIMESTAMP?NOT?NULL,??
  • )??
  • 1、創(chuàng)建插入時的觸發(fā)器

    [sql]? view plain copy
  • CREATE?TRIGGER?TRI_INSERT??
  • AFTER?INSERT?ON?T_ORDER?FOR?EACH?ROW??
  • BEGIN??
  • INSERT?INTO?learning.t_order_time(ORDER_NUM,ORDER_TIME)?VALUES(NEW.ORDER_NUM,NOW());??
  • END??
  • 然后訂單表中插入一條數(shù)據(jù)
    [sql]? view plain copy
  • INSERT?INTO?T_ORDER(ORDER_NUM,ORDER_NAME)?VALUES(1,'電腦');??
  • SELECT?*?FROM?t_order;??
  • SELECT?*?FROM?t_order_time;??
  • 這是訂單表中插入的數(shù)據(jù):


    這是訂單時間表中自動插入的數(shù)據(jù):


    2、更新時插入數(shù)據(jù)

    [sql]? view plain copy
  • //更新創(chuàng)建觸發(fā)器??
  • CREATE?TRIGGER?TRI_UPDATA??
  • BEFORE?UPDATE?ON?T_ORDER?FOR?EACH?ROW??
  • BEGIN??
  • UPDATE??learning.t_order_time?SET?ORDER_TIME=NOW()?WHERE?OLD.ORDER_NUM=ORDER_NUM;??
  • END??
  • ??
  • UPDATE?T_ORDER??SET?ORDER_NAME='餅干餅'?WHERE?ORDER_NUM=1;??
  • SELECT?*?FROM?t_order;??
  • SELECT?*?FROM?t_order_time;??


  • 可以看到,時間已經(jīng)更新

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

    [java]? view plain copy
  • //創(chuàng)建刪除觸發(fā)器??
  • CREATE?TRIGGER?TRI_DELETE??
  • AFTER?DELETE?ON?T_ORDER?FOR?EACH?ROW??
  • BEGIN??
  • DELETE?FROM??learning.t_order_time??WHERE?OLD.ORDER_NUM=ORDER_NUM;??
  • END??
  • ??
  • DELETE?FROM??learning.t_order??WHERE?ORDER_NUM=1;??
  • SELECT?*?FROM?t_order;??
  • SELECT?*?FROM?t_order_time;??


  • 可以看到,數(shù)據(jù)庫中都沒有數(shù)據(jù)了。


    4、查看觸發(fā)器

    查看觸發(fā)器是指查看數(shù)據(jù)庫中已存在的觸發(fā)器的定義、狀態(tài)和語法等信息。查看觸發(fā)器的方法包括SHOW TRIGGERS語句和查詢information_schema數(shù)據(jù)庫下的triggers表等。本節(jié)將詳細講解查看觸發(fā)器的方法。

    MySQL中,可以執(zhí)行SHOW TRIGGERS語句來查看觸發(fā)器的基本信息。其基本形式如下:

    SHOW?TRIGGERS ;


    MySQL中,所有觸發(fā)器的定義都存在information_schema數(shù)據(jù)庫下的triggers表中。查詢triggers表,可以查看到數(shù)據(jù)庫中所有觸發(fā)器的詳細信息。查詢的語句如下:

    SELECT?*? FROM? information_schema.triggers;


    5、刪除觸發(fā)器

    [sql]? view plain copy
  • DROP?TRIGGER?觸發(fā)器名??
  • 6、觸發(fā)器 與存儲過程
    觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲程序,也不能使用采用CALL語句的動態(tài)SQL
    (允許存儲程序通過參數(shù)將數(shù)據(jù)返回觸發(fā)程序)。?
    而存儲過程 可以接受參數(shù),將結(jié)果范圍給應(yīng)用程序

    轉(zhuǎn)載于:https://my.oschina.net/zhanghaiyang/blog/606467

    總結(jié)

    以上是生活随笔為你收集整理的Mysql学习总结(10)——MySql触发器使用讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。