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

mysql觸發(fā)器之創(chuàng)建多個觸發(fā)器操作實例分析

 更新時間:2019年12月17日 08:56:52   作者:luyaran  
這篇文章主要介紹了mysql觸發(fā)器之創(chuàng)建多個觸發(fā)器操作,結(jié)合實例形式分析了mysql創(chuàng)建及使用多個觸發(fā)器的相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了mysql觸發(fā)器之創(chuàng)建多個觸發(fā)器操作。分享給大家供大家參考,具體如下:

這次記錄的內(nèi)容mysql 版本必須得是5.7.2+的哈,之前的會不好使的。廢話不多說,咱們開始正文哈。

在mysql 5.7.2+版本之前,我們只能為表中的事件創(chuàng)建一個觸發(fā)器,例如,只能為BEFORE UPDATE或AFTER UPDATE事件創(chuàng)建一個觸發(fā)器。 mysql 5.7.2+版本解決了這樣限制,并允許我們?yōu)楸碇械南嗤录蛣幼鲿r間創(chuàng)建多個觸發(fā)器。當(dāng)事件發(fā)生時,觸發(fā)器將依次激活。我們來參考創(chuàng)建第一個觸發(fā)器中的語法。如果表中有相同事件有多個觸發(fā)器,mysql 將按照創(chuàng)建的順序調(diào)用觸發(fā)器。要更改觸發(fā)器的順序,需要在FOR EACH ROW子句之后指定FOLLOWS或PRECEDES。我們來看下這兩個詞的說明:

  • FOLLOWS選項允許新觸發(fā)器在現(xiàn)有觸發(fā)器之后激活。
  • PRECEDES選項允許新觸發(fā)器在現(xiàn)有觸發(fā)器之前激活。

完事來看下使用顯式順序創(chuàng)建新的附加觸發(fā)器的語法:

DELIMITER $$
CREATE TRIGGER trigger_name
[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_name
FOR EACH ROW [FOLLOWS|PRECEDES] existing_trigger_name
BEGIN
…
END$$
DELIMITER ;

然后,我們來看一個在表中的同一個事件和動作上,創(chuàng)建多個觸發(fā)器的例子。我們來基于products表進(jìn)行演示,首先來創(chuàng)建一個新的price_logs表,完事呢,每當(dāng)更改產(chǎn)品的價格(MSRP列)時,要將舊的價格記錄在一個名為price_logs的表中,先來看想sql:

CREATE TABLE price_logs (
 id INT(11) NOT NULL AUTO_INCREMENT,
 product_code VARCHAR(15) NOT NULL,
 price DOUBLE NOT NULL,
 updated_at TIMESTAMP NOT NULL DEFAULT 
       CURRENT_TIMESTAMP 
       ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (id),
 KEY product_code (product_code),
 CONSTRAINT price_logs_ibfk_1 FOREIGN KEY (product_code) 
 REFERENCES products (productCode) 
 ON DELETE CASCADE 
 ON UPDATE CASCADE
);

完事,當(dāng)表的BEFORE UPDATE事件發(fā)生時,創(chuàng)建一個新的觸發(fā)器。觸發(fā)器名稱為before_products_update,具體實現(xiàn)如下所示:

DELIMITER $$
CREATE TRIGGER before_products_update 
  BEFORE UPDATE ON products 
  FOR EACH ROW 
BEGIN
   INSERT INTO price_logs(product_code,price)
   VALUES(old.productCode,old.msrp);
END$$
DELIMITER ;

然后,當(dāng)我們更改產(chǎn)品的價格,并使用以下update語句,最后查詢price_logs表:

UPDATE products
SET msrp = 95.1
WHERE productCode = 'S10_1678';
-- 查詢結(jié)果價格記錄
SELECT * FROM price_logs;

上面查詢語句執(zhí)行后,得到以下結(jié)果:

+----+--------------+-------+---------------------+
| id | product_code | price | updated_at     |
+----+--------------+-------+---------------------+
| 1 | S10_1678   | 95.7 | 2017-08-03 02:46:42 |
+----+--------------+-------+---------------------+
1 row in set

可以看到結(jié)果中,它按我們預(yù)期那樣工作了。

完事我們再來假設(shè)不僅要看到舊的價格,改變的時候,還要記錄是誰修改了它。要實現(xiàn)這個,我們可以向price_logs表添加其他列,但是,為了實現(xiàn)多個觸發(fā)器的演示,我們將創(chuàng)建一個新表來存儲進(jìn)行更改的用戶的數(shù)據(jù)。這個新表的名稱為user_change_logs,結(jié)構(gòu)如下:

CREATE TABLE user_change_logs (
 id int(11) NOT NULL AUTO_INCREMENT,
 product_code varchar(15) DEFAULT NULL,
 updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
 ON UPDATE CURRENT_TIMESTAMP,
 updated_by varchar(30) NOT NULL,
 PRIMARY KEY (id),
 KEY product_code (product_code),
 CONSTRAINT user_change_logs_ibfk_1 FOREIGN KEY (product_code) 
 REFERENCES products (productCode) 
 ON DELETE CASCADE ON UPDATE CASCADE
);

現(xiàn)在,我們創(chuàng)建一個在products表上的BEFORE UPDATE事件上激活的第二個觸發(fā)器。 此觸發(fā)器將更改的用戶信息更新到user_change_logs表。 它在before_products_update觸發(fā)后被激活:

DELIMITER $$
CREATE TRIGGER before_products_update_2 
  BEFORE UPDATE ON products 
  FOR EACH ROW FOLLOWS before_products_update
BEGIN
  INSERT INTO user_change_logs(product_code,updated_by)
  VALUES(old.productCode,user());
END$$
DELIMITER ;

然后我們來使用update語句更新指定產(chǎn)品的價格:

UPDATE products
SET msrp = 95.3
WHERE productCode = 'S10_1678';

再來分別從price_logs和user_change_logs表查詢數(shù)據(jù):

mysql> SELECT * FROM price_logs;
+----+--------------+-------+---------------------+
| id | product_code | price | updated_at     |
+----+--------------+-------+---------------------+
| 1 | S10_1678   | 95.7 | 2017-08-03 02:46:42 |
| 2 | S10_1678   | 95.1 | 2017-08-03 02:47:21 |
+----+--------------+-------+---------------------+
2 rows in set
mysql> SELECT * FROM user_change_logs;
+----+--------------+---------------------+----------------+
| id | product_code | updated_at     | updated_by   |
+----+--------------+---------------------+----------------+
| 1 | S10_1678   | 2017-08-03 02:47:21 | root@localhost |
+----+--------------+---------------------+----------------+
1 row in set

如上所見,兩個觸發(fā)器按照預(yù)期的順序激活執(zhí)行相關(guān)操作了。完事我們來在information_schema數(shù)據(jù)庫的triggers表中的action_order列,看下觸發(fā)激活同一事件和操作的順序:

mysql> SELECT 
  trigger_name, action_order
FROM
  information_schema.triggers
WHERE
  trigger_schema = 'yiibaidb'
ORDER BY event_object_table , 
     action_timing , 
     event_manipulation;
+--------------------------+--------------+
| trigger_name       | action_order |
+--------------------------+--------------+
| before_employee_update  |      1 |
| before_products_update  |      1 |
| before_products_update_2 |      2 |
+--------------------------+--------------+
3 rows in set

好啦,本次記錄就到這里了。

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總

希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。

相關(guān)文章

  • MySQL8忘記密碼的快速解決方法

    MySQL8忘記密碼的快速解決方法

    這篇文章主要給大家介紹了關(guān)于MySQL8忘記密碼的快速解決方法,文中通過示例代碼以及圖片介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 實操M(fèi)ySQL+PostgreSQL批量插入更新insertOrUpdate

    實操M(fèi)ySQL+PostgreSQL批量插入更新insertOrUpdate

    這篇文章主要介紹了MYsql和PostgreSQL優(yōu)勢對比以及如何實現(xiàn)MySQL + PostgreSQL批量插入更新insertOrUpdate,附含詳細(xì)的InserOrupdate代碼實例,需要的朋友可以參考下
    2021-08-08
  • win10下mysql 8.0.18 安裝配置方法圖文教程(windows版)

    win10下mysql 8.0.18 安裝配置方法圖文教程(windows版)

    這篇文章主要介紹了windows版的mysql 8.0.18 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Mysql DNS反向解析導(dǎo)致連接超時過程分析(skip-name-resolve)

    Mysql DNS反向解析導(dǎo)致連接超時過程分析(skip-name-resolve)

    從其它地方連接MySQL數(shù)據(jù)庫的時候,有時候很慢。慢的原因有可能是MySQL進(jìn)行反向DNS解析造成的,這里簡單介紹下原理,需要的朋友可以參考下
    2013-03-03
  • MySQL備份和還原操作小結(jié)

    MySQL備份和還原操作小結(jié)

    備份數(shù)據(jù)庫兩個主要方法是用mysqldump程序或直接拷貝數(shù)據(jù)庫文件,這篇文章主要介紹了MySQL備份和還原操作小結(jié),需要的朋友可以參考下
    2024-08-08
  • 解讀mysql datetime類型精確到毫秒、微秒的問題

    解讀mysql datetime類型精確到毫秒、微秒的問題

    這篇文章主要介紹了解讀mysql datetime類型精確到毫秒、微秒的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mysql數(shù)據(jù)庫單表最大存儲依據(jù)詳解

    mysql數(shù)據(jù)庫單表最大存儲依據(jù)詳解

    這篇文章主要為大家介紹了mysql數(shù)據(jù)庫單表最大存儲的依據(jù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • MySQL整型數(shù)據(jù)溢出的解決方法

    MySQL整型數(shù)據(jù)溢出的解決方法

    這篇文章主要介紹了MySQL整型數(shù)據(jù)溢出的解決方法,本文出現(xiàn)整型溢出的mysql版本是5.1,5.1下整型溢出不會報錯,而會變成負(fù)數(shù),需要的朋友可以參考下
    2014-07-07
  • 計算機(jī)二級考試MySQL??键c(diǎn) 8種MySQL數(shù)據(jù)庫設(shè)計優(yōu)化方法

    計算機(jī)二級考試MySQL??键c(diǎn) 8種MySQL數(shù)據(jù)庫設(shè)計優(yōu)化方法

    這篇文章主要為大家詳細(xì)介紹了計算機(jī)二級考試MySQL??键c(diǎn),詳細(xì)介紹8種MySQL數(shù)據(jù)庫設(shè)計優(yōu)化方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • MySQL中SQL模式的特點(diǎn)總結(jié)

    MySQL中SQL模式的特點(diǎn)總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于MySQL中SQL模式特點(diǎn)的相關(guān)資料,文章介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評論

江安县| 麟游县| 班玛县| 镇原县| 新源县| 股票| 宁都县| 米脂县| 张家港市| 临汾市| 石泉县| 香格里拉县| 东阿县| 德化县| 龙南县| 上蔡县| 荣成市| 科技| 宾阳县| 澜沧| 纳雍县| 湖口县| 永修县| 星子县| 柘荣县| 西乌珠穆沁旗| 米脂县| 同德县| 镇赉县| 增城市| 津市市| 荔浦县| 土默特左旗| 福建省| 桂林市| 白河县| 安陆市| 澄江县| 峡江县| 明星| 微山县|