久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql觸發器之創建多個觸發器操作的示例分析

146次閱讀
沒有評論

共計 4129 個字符,預計需要花費 11 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 mysql 觸發器之創建多個觸發器操作的示例分析,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

在 mysql 5.7.2+ 版本之前,我們只能為表中的事件創建一個觸發器,例如,只能為 BEFORE UPDATE 或 AFTER UPDATE 事件創建一個觸發器。mysql 5.7.2+ 版本解決了這樣限制,并允許我們為表中的相同事件和動作時間創建多個觸發器。當事件發生時,觸發器將依次激活。我們來參考創建第一個觸發器中的語法。如果表中有相同事件有多個觸發器,mysql 將按照創建的順序調用觸發器。要更改觸發器的順序,需要在 FOR EACH ROW 子句之后指定 FOLLOWS 或 PRECEDES。我們來看下這兩個詞的說明:

FOLLOWS 選項允許新觸發器在現有觸發器之后激活。

PRECEDES 選項允許新觸發器在現有觸發器之前激活。

完事來看下使用顯式順序創建新的附加觸發器的語法:

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

然后,我們來看一個在表中的同一個事件和動作上,創建多個觸發器的例子。我們來基于 products 表進行演示,首先來創建一個新的 price_logs 表,完事呢,每當更改產品的價格 (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
);

完事,當表的 BEFORE UPDATE 事件發生時,創建一個新的觸發器。觸發器名稱為 before_products_update,具體實現如下所示:

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 ;

然后,當我們更改產品的價格,并使用以下 update 語句,最后查詢 price_logs 表:

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

上面查詢語句執行后,得到以下結果:

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

可以看到結果中,它按我們預期那樣工作了。

完事我們再來假設不僅要看到舊的價格,改變的時候,還要記錄是誰修改了它。要實現這個,我們可以向 price_logs 表添加其他列,但是,為了實現多個觸發器的演示,我們將創建一個新表來存儲進行更改的用戶的數據。這個新表的名稱為 user_change_logs,結構如下:

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
);

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

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 語句更新指定產品的價格:

UPDATE products
SET msrp = 95.3
WHERE productCode =  S10_1678

再來分別從 price_logs 和 user_change_logs 表查詢數據:

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

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

mysql  SELECT 
 trigger_name, action_order
 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

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

關于“mysql 觸發器之創建多個觸發器操作的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計4129字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 习水县| 宁夏| 密云县| 邢台县| 尼木县| 阳曲县| 佛冈县| 丹阳市| 邓州市| 碌曲县| 汤原县| 巴林左旗| 西安市| 红原县| 龙南县| 隆林| 汶上县| 阿城市| 盘锦市| 波密县| 准格尔旗| 正阳县| 云林县| 吉安市| 宝兴县| 南宫市| 永嘉县| 伊川县| 黎城县| 牡丹江市| 兴仁县| 梁平县| 昭通市| 紫云| 贺兰县| 会泽县| 溆浦县| 如东县| 娄烦县| 吉首市| 孟连|